用于.NET的可编程RAM磁盘API?

寻找一个RAM磁盘API(或实现的一组等同的软件)来临时存储文件以便在物理硬盘环境之外进行读/写操作。

更新 exe文件将被写入RAM磁盘并执行。

“RAM磁盘”是操作系统级别的结构,因为它必须实现文件系统和设备驱动程序来模拟磁盘。 你不能在图书馆一级这样做。

如果你想追求操作系统的水平,Windows带有一个内置的ramdisk.sys驱动程序。

否则,在应用程序中将文件读取到数据结构中将具有与使用RAM磁盘相同的性能特征。 通常情况下,当应用程序不知道它正在运行RAM缓存文件时,将使用RAM磁盘。 如果你的应用程序知道它想要这样做的事实,直接读入你的应用程序的数据。

ramdisk.sys是一个驱动程序,你可以从微软获得驱动程序演示,但显然不能保证在Windows 7上工作,所以祝你好运。 你可以找到其他的ramdisk实现,但是你必须安装它们,这意味着修改你的驱动器(例如,第1步:安装一个粗略的驱动程序)。

所以这就引出了你真正想要做什么的问题。 如果您的目标是为某些可执行文件创建一个沙盒,以便它们不能写入本地驱动器,这听起来不是正确的方法。 如果目标是制作一小组可执行文件,以便它们能够快速运行,这似乎并不是正确的方法–Windows缓存可执行文件,因此第二次启动速度更快。 如果目标是要创建一个小的,易于清理的可执行文件运行区域,那么windows temp目录应该是这样的地方。 如果你想制作一个像norton公用程序或者ghost这样的系统,而不用留下任何痕迹就可以无限制地访问硬盘驱动器,那么我就会问.NET是否是正确的方法,因为.NET将会打击无论如何,你的HD硬和沉重。 如果你的目标是创建一个病毒或特洛伊木马隐藏其有效载荷在公羊驱动器,我质疑你的动机。

你真的想做什么?

Dokan是用户模式文件系统驱动程序,而不是ramdisk。 从这个内存驱动器直接进行 – 我做了一个快速的.NET应用程序,使TWAIN扫描仪作为一个演示显示为驱动器,但我发现,当我使用它时,dokan,使我的机器脆弱:任何当我和他一起工作的时候,我的失误意味着重启土地。 再次,它需要安装一个驱动程序。 希望这会变得更好。

ImDisk是一个RAM磁盘应用程序,可以从内存扇区创建一个虚拟驱动器,并具有可以从.NET调用的API。

class RamDisk { public const string MountPoint = "X:"; public void createRamDisk() { try { string initializeDisk = "imdisk -a "; string imdiskSize = "-s 1024M "; string mountPoint = "-m "+ MountPoint + " "; ProcessStartInfo procStartInfo = new ProcessStartInfo(); procStartInfo.UseShellExecute = false; procStartInfo.CreateNoWindow = true; procStartInfo.FileName = "cmd"; procStartInfo.Arguments = "/C " + initializeDisk + imdiskSize + mountPoint; Process.Start(procStartInfo); formatRAMDisk(); } catch (Exception objException) { Console.WriteLine("There was an Error, while trying to create a ramdisk! Do you have imdisk installed?"); Console.WriteLine(objException); } } /** * since the format option with imdisk doesn't seem to work * use the fomat X: command via cmd * * as I would say in german: * "Von hinten durch die Brust ins Auge" * **/ private void formatRAMDisk(){ string cmdFormatHDD = "format " + MountPoint + "/Q /FS:NTFS"; SecureString password = new SecureString(); password.AppendChar('0'); password.AppendChar('8'); password.AppendChar('1'); password.AppendChar('5'); ProcessStartInfo formatRAMDiskProcess = new ProcessStartInfo(); formatRAMDiskProcess.UseShellExecute = false; formatRAMDiskProcess.CreateNoWindow = true; formatRAMDiskProcess.RedirectStandardInput = true; formatRAMDiskProcess.FileName = "cmd"; formatRAMDiskProcess.Verb = "runas"; formatRAMDiskProcess.UserName = "Administrator"; formatRAMDiskProcess.Password = password; formatRAMDiskProcess.Arguments = "/C " + cmdFormatHDD; Process process = Process.Start(formatRAMDiskProcess); sendCMDInput(process); } private void sendCMDInput(Process process) { StreamWriter inputWriter = process.StandardInput; inputWriter.WriteLine("J"); inputWriter.Flush(); inputWriter.WriteLine("RAMDisk for valueable data"); inputWriter.Flush(); } public string getMountPoint() { return MountPoint; } }