Как я могу создать RAM-диск программно?
Я не ищу код, который вызывает утилиту командной строки, что делает трюк. Мне действительно интересно знать API, используемый для создания RAM-диска.
Спасибо.
ИЗМЕНИТЬ
Мотивация. У меня есть сторонняя библиотека, которая ожидает имя каталога, чтобы обработать файлы в этом каталоге определенным образом. У меня эти файлы заархивированы в архиве. Я хочу извлечь архив в RAM-диск и передать третьей стороне путь к соответствующему каталогу на этом RAM-диске. Как вы можете видеть, файлы с отображением памяти мне бесполезны.
Ответы
Ответ 1
Нет никакого API для создания RAM-диска как такового. Вам нужно написать свой собственный драйвер устройства, который представляет новый диск в систему, и заставить этот драйвер устройства работать с выделенной памятью.
EDIT (после редактирования OP)
То, что вы пытаетесь сделать, обычно будет выполняться с использованием каталога temp, который должен находиться на самом быстром диске, доступном в системе. Таким образом, система, у которой уже есть RAMdisk, вероятно, будет иметь свою переменную окружения temp, уже установленную так, чтобы указывать на папку в RAMdisk, а системы без RAMdisk просто снижают производительность, это их проблема.
Теперь, если по какой-то причине вы не можете полагаться на наличие RAMdisk в системе, и вам абсолютно нужна самая быстрая производительность, тогда я не вижу возможности, кроме как установить стороннюю (возможно, свободно загружаемую, возможно, даже с открытым исходным кодом) RAM-диск, используйте его временно, а затем удалите его. Но это очень неуклюже.
Ответ 2
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;
}
}
Ответ 3
Вы не упомянули язык, sO мой ответ в С#:
Файл с отображением памяти содержит содержимое файла в виртуальной памяти. Это сопоставление между файлом и памятью позволяет приложению, включая несколько процессов, изменять файл, читая и записывая непосредственно в память. Начиная с версии .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);
}