2012-01-01 12 views
26

Non sto cercando un codice che richiami un'utilità della riga di comando, che fa il trucco. In realtà sono interessato a conoscere l'API utilizzata per creare un disco RAM.Come posso creare un disco RAM programmaticamente?

Grazie.

EDIT

motivazione: ho una libreria di terze parti che si aspetta un nome di directory, al fine di elaborare i file in quella directory in un certo modo. Ho questi file compressi in un archivio. Desidero estrarre l'archivio in un disco RAM e passare il terzo percorso il percorso alla rispettiva directory su quel disco RAM. Come potete vedere, i file di memoria mappati non mi servono.

+1

Se si considera RAM * disco *, non esiste tale funzione 'CreateRAMDisk' in Windows. Penso che sia necessario vedere come creare un driver per un disco, ma il disco viene reindirizzato alla RAM. Tuttavia, se si desidera semplicemente reindirizzare i file alla memoria, l'utilizzo di file mappati in memoria comporterà l'operazione. – minjang

+0

Ho modificato la mia domanda. – mark

+0

possibile duplicato di [API RAM disco programmabile per .NET?] (Http://stackoverflow.com/questions/2402888/programmable-ram-disk-api-for-net) –

risposta

1

Non v'è alcuna API per creare un disco RAM di per sé. È necessario scrivere il proprio driver di dispositivo che presenti un nuovo disco nel sistema e farlo funzionare con la memoria allocata.

EDIT (dopo modifica del PO)

Che cosa si sta cercando di fare normalmente essere fatto utilizzando la directory 'temp', che dovrebbe risiedere sul disco più veloce disponibile nel sistema. Quindi, un sistema che ha già un RAMdisk avrà probabilmente la sua variabile ambiente temporanea già impostata per puntare a una cartella sul disco RAM, e i sistemi senza RAMdisk prenderebbero semplicemente la penalizzazione delle prestazioni, è il loro problema.

Ora, se per qualche motivo non si può fare affidamento sulla presenza di un RAMdisk su un sistema, E si ha assolutamente bisogno delle prestazioni più veloci possibili, quindi non vedo alcuna opzione se non quella di installare una terza parte (magari liberamente scaricabile, forse anche open source) disco RAM, utilizzarlo temporaneamente, quindi disinstallarlo. Ma è molto goffo.

+11

"scrivi il tuo driver di dispositivo" è anche "virtualmente impossibile" secondo me ... – mark

+3

Sì, penso che le persone di tutto il pianeta che si sentiranno a proprio agio nell'adempiere tale compito probabilmente si adattino a una stanza. –

+1

Per quanto tempo sopravviverà questo argomento? Risurrezione del disco RAM -> The SSD .. – Karel

6

voi non ha ancora citato la lingua, quindi la mia risposta è in C#:

Un file mappato in memoria contiene il contenuto di un file in memoria virtuale. Questa mappatura tra un file e lo spazio di memoria consente a un'applicazione, inclusi più processi, di modificare il file leggendo e scrivendo direttamente nella memoria. A partire da .NET Framework versione 4, è possibile utilizzare il codice gestito per accedere ai file mappati in memoria nello stesso modo in cui le funzioni native di Windows accedono ai file mappati in memoria, come descritto in Gestione dei file mappati in memoria in Win32 in MSDN Library.

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 

// crea la visualizzazione della mappa e la lesse:

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

Questo è un file mappato in memoria. Non è un disco RAM. –

+0

@MikeNakis ci sono 'File mappati in memoria non persistenti' e' file mappati in memoria persistenti' http: // msdn.microsoft.com/en-us/library/dd997372.aspx –

+0

@MikeNakis 'I file non persistenti sono file mappati in memoria che non sono associati a un file su un disco. –

27

ImDisk è un'app RAM disk che crea un'unità virtuale da un settore di memoria e ha un'API che può essere chiamata da .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; 
    } 
} 
+0

Strumento eccellente! –

+3

Dopo aver provato sia 'IMDisk' che' SoftPerfect RAM DIsk', preferisco 'SoftPerfect's '. Aveva prestazioni migliori, solo 0,2 MB riservati di 100 MB allocati, contro 10 MB per' IMDisk', e non richiedevano l'utente ' Prompt Controllo account (UAC) 'per montare le unità. Entrambi supportano un'opzione persistente, ma l'ho provato. – Loathing

Problemi correlati