web-dev-qa-db-ja.com

プログラムでRAMディスクを作成するにはどうすればよいですか?

トリックを行うコマンドラインユーティリティを呼び出すコードを探していません。 RAMディスクを作成するために使用されるAPIを知りた​​いと思っています。

[〜#〜]編集[〜#〜]

動機:ある方法でそのディレクトリ内のファイルを処理するためにディレクトリ名を期待するサードパーティのライブラリがあります。これらのファイルはアーカイブに圧縮されています。アーカイブをRAMディスクに抽出し、サードパーティにそのRAMディスク上の各ディレクトリへのパスを渡します。ご覧のとおり、- メモリマップファイルは私には役に立ちません

28
mark

RAMディスク自体を作成するAPIはありません。新しいディスクをシステムに提示する独自のデバイスドライバーを作成し、そのデバイスドライバーを割り当てられたメモリで動作させる必要があります。

EDIT(OPの編集後)

あなたがやろうとしていることは通常、システムで利用可能な最速のディスク上にあるはずの「temp」ディレクトリを使用して行われます。したがって、RAMdiskが既にあるシステムでは、おそらくtempdisk環境変数がRAMdisk上のフォルダーを指すように設定されているでしょう。RAMdiskがないシステムでは、単にパフォーマンスが低下するだけです。それが問題です。

今、何らかの理由でシステム上のRAMdiskの存在に頼ることができず、可能な限り最速のパフォーマンスが絶対に必要な場合、サードパーティをインストールする以外に選択肢はありません(おそらく自由にダウンロードでき、おそらくオープンソースでさえあります)。 RAMディスク、一時的に使用してからアンインストールします。しかし、それは非常に不格好です。

1
Mike Nakis

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

あなたは言語に言及しませんでした、私の答えはc#です:

メモリマップファイルには、仮想メモリ内のファイルの内容が含まれています。ファイルとメモリ空間の間のこのマッピングにより、複数のプロセスを含むアプリケーションは、メモリを直接読み書きすることによってファイルを変更できます。 .NET Frameworkバージョン4以降、MSDNライブラリの「Win32でのメモリマップファイルの管理」で説明されているように、ネイティブWindows関数がメモリマップファイルにアクセスするのと同じ方法で、マネージコードを使用してメモリマップファイルにアクセスできます。

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

//マップビューを作成して読み取ります。

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

WinFspを使用すると、プレーンなC++またはdotNet C#を使用して、プログラムで独自のファイルシステムを定義できます。 サンプルプロジェクトは、OSに永続化されたファイルシステムですRAM memory。ま​​た、ドカニー

https://github.com/billziss-gh/winfsp

https://github.com/dokan-dev/dokany

0
rodix