Как программно создать RAM-диск? - PullRequest
27 голосов
/ 01 января 2012

Я не ищу код, который вызывает утилиту командной строки, которая делает свое дело.Мне действительно интересно знать API, используемый для создания RAM-диска.

EDIT

Мотивация: у меня есть сторонняя библиотека, которая ожидает имя каталога для того, чтобыобрабатывать файлы в этом каталоге определенным образом.У меня есть эти файлы в архиве.Я хочу извлечь архив на RAM-диск и передать третьей стороне путь к соответствующему каталогу на этом RAM-диске.Как видите, файлы с отображением в памяти мне не нужны .

Ответы [ 4 ]

30 голосов
/ 06 февраля 2013

ImDisk - это приложение на диске RAM, которое создает виртуальный диск из сектора памяти и имеет API, который можно вызывать из .NET.

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;
    }
}
6 голосов
/ 01 января 2012

Вы не упомянули язык, так что мой ответ на c #:

Отображенный в памяти файл содержит содержимое файла в виртуальной памяти. Такое сопоставление между файлом и пространством памяти позволяет приложению, включая несколько процессов, изменять файл, читая и записывая непосредственно в память. Начиная с .NET Framework версии 4, вы можете использовать управляемый код для доступа к файлам с отображением в памяти так же, как собственные функции Windows обращаются к файлам с отображением в памяти, как описано в разделе Управление файлами с отображением в памяти в Win32 в библиотеке MSDN.

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);
}
1 голос
/ 01 января 2012

Нет API для создания RAM-диска как такового.Вам необходимо написать свой собственный драйвер устройства, который представляет новый диск в систему, и заставить этот драйвер устройства работать с выделенной памятью.

РЕДАКТИРОВАТЬ (после редактирования ОП)

То, что вы пытаетесь сделать, обычно делается с использованием каталога 'temp', который должен находиться на самом быстром доступном диске в системе.Таким образом, в системе, в которой уже есть RAM-диск, вероятно, будет установлена ​​временная переменная среды, указывающая на папку на RAM-диске, а системы без RAM-диска просто понизят производительность, это их проблема.

Теперь, если по какой-то причине вы не можете полагаться на наличие RAM-диска в системе, и вам абсолютно необходима максимально возможная производительность, то я не вижу другого выбора, кроме как установить стороннюю версию (возможно, свободно загружаемую, возможно, даже с открытым исходным кодом)RAM-диск, используйте его временно, а затем удалите его.Но это очень неуклюже.

0 голосов
/ 22 февраля 2019

WinFsp позволяет программно определять собственную файловую систему, используя обычный c ++ или dotNet C #. Пример проекта - файловая система, сохраненная в оперативной памяти ОС . Вы также можете взглянуть на Доканы .

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...