我该如何通过程序创建一个RAM磁盘?

35

我不是在寻找调用命令行实用程序的代码来完成此操作。我实际上想了解创建RAM磁盘所使用的API。

编辑

动机:我有一个第三方库,需要目录名称才能以某种方式处理该目录中的文件。我已将这些文件压缩在存档中。 我希望将存档提取到RAM磁盘中,并向第三方传递相应目录在RAM磁盘上的路径。如您所见,内存映射文件对我没有用


2
如果你真的考虑RAM 磁盘,在Windows中没有CreateRAMDisk函数。我认为你需要看一下如何创建一个驱动程序来管理磁盘,但是这个磁盘被重定向到RAM。然而,如果你只是想将文件重定向到内存,那么使用内存映射文件就可以完成任务。 - minjang
可能是.NET的可编程RAM磁盘API?的重复问题。 - Chris Moschini
4个回答

36

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;
    }
}

4
我尝试了IMDiskSoftPerfect RAM Disk两个软件,我更喜欢SoftPerfect的。它的性能更好,只保留了100 MB分配中的0.2 MB,而IMDisk则是10 MB,并且不需要用户账户控制(UAC)提示来装载驱动器。两者都支持持久选项,但我没有测试过。 - Loathing

8

您没有提及使用的语言,所以我的答案是c#:

内存映射文件包含虚拟内存中文件的内容。文件和内存空间之间的这种映射使应用程序(包括多个进程)能够通过直接读写内存来修改文件。从.NET Framework版本4开始,您可以使用托管代码以与本机Windows函数访问内存映射文件相同的方式访问内存映射文件,如MSDN库中的《Win32中管理内存映射文件》所述。

http://msdn.microsoft.com/zh-cn/library/dd997372.aspx

MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen(
       new FileStream(@"C:\temp\Map.mp", FileMode.Create), // Any stream will do it      
       "MyMemMapFile",                                     // Name
       1024 * 1024,                                        // Size in bytes
       MemoryMappedFileAccess.ReadWrite);                  // Access type

// 创建地图视图并读取:

using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor())
{
       Container NewContainer = new Container();
       FileMap.Read<Container>(4, out NewContainer);
}

11
这是一个内存映射文件,而不是RAM磁盘。 - Mike Nakis
@MikeNakis,有“非持久化内存映射文件”和“持久化内存映射文件”http://msdn.microsoft.com/en-us/library/dd997372.aspx - Royi Namir
@MikeNakis:「非持久化文件」指的是未关联到磁盘上的文件,而是内存映射文件。 - Royi Namir

2

1

没有API可以直接创建RAM磁盘。您需要编写自己的设备驱动程序,将一个新的磁盘呈现给系统,并使该设备驱动程序与分配的内存一起工作。

编辑(在OP编辑后)

您正在尝试完成的操作通常使用“temp”目录完成,该目录应位于系统中可用的最快磁盘上。因此,已经拥有RAM磁盘的系统可能已经将其temp环境变量设置为指向RAM磁盘上的文件夹,而没有RAM磁盘的系统将简单地承受性能损失,这是他们的问题。

现在,如果由于某种原因您不能依赖系统上存在RAM磁盘,并且您绝对需要最快的性能,则我认为除了安装第三方(也许是免费下载的,甚至是开源的)RAM磁盘之外,别无选择,然后再卸载它。但那非常笨重。


15
在我看来,“编写自己的设备驱动程序”和“几乎不可能”是同义词... - mark
3
是的,我认为全球愿意承担这项任务并感到舒适的人可能只需要一个房间就可以容纳。 - Mike Nakis
1
为什么Win32 API函数GetDriveType专门为RAM磁盘设置了返回值,如果没有其他Win32 API函数可以创建它? - BlueMonkMN
我不确定,但我的猜测是Windows从每个驱动器的设备驱动程序获取此信息(以及其他功能),因此大多数驱动程序返回“否”,但ramdisk设备驱动程序的作者将使其设备驱动程序返回“是”。 - Mike Nakis
截至2019年2月,WinFsp和Dokany已经足够能够创建存储在操作系统RAM中的文件系统。 - rodix
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接