如何以编程方式创建RAM磁盘?

mar*_*ark 27 windows ram

我不是在寻找一个调用命令行实用程序的代码,它可以解决问题.我真的很想知道用于创建RAM磁盘的API.

编辑

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

Rob*_*cks 31

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 尝试了`IMDisk`和`SoftPerfect RAM DIsk`后,我更喜欢`SoftPerfect'.它有更好的性能,仅保留0.2 MB的100 MB分配,而不是10 MB的`IMDisk`,并且不需要`用户帐户控制(UAC)`提示安装驱动器.两者都支持持久性选项,但我测试了它. (4认同)

Roy*_*mir 6

你没有提到语言,我的回答是在c#:

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

http://msdn.microsoft.com/en-us/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
Run Code Online (Sandbox Code Playgroud)

//创建地图视图并阅读它:

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

  • 那是一个内存映射文件.它不是RAM磁盘. (9认同)
  • 那是正确的.内存映射文件不是RAM磁盘. (8认同)

Mik*_*kis 1

本身没有创建 RAM 磁盘的 API。您需要编写自己的设备驱动程序,向系统提供新磁盘,并使该设备驱动程序与分配的内存一起工作。

编辑(OP编辑后)

您尝试执行的操作通常是使用“temp”目录来完成,该目录应该驻留在系统中可用的最快磁盘上。因此,已经拥有 RAMdisk 的系统可能会将其临时环境变量设置为指向 RAMdisk 上的文件夹,而没有 RAMdisk 的系统只会遭受性能损失,这是他们的问题。

现在,如果由于某种原因你不能依赖系统上 RAMdisk 的存在,并且你绝对需要尽可能快的性能,那么我别无选择,只能安装第三方(可能可以免费下载,甚至可能是开源的) RAM盘,暂时使用,然后卸载。但这非常笨拙。

  • 在我看来,“编写自己的设备驱动程序”是“几乎不可能”的同义词...... (15认同)
  • 是的,我认为全世界愿意承担这样的任务的人可能都适合在一个房间里。 (3认同)