2012-01-01 20 views
26

No estoy buscando un código que invoca una utilidad de línea de comandos, lo que hace el truco. De hecho, estoy interesado en conocer la API utilizada para crear un disco RAM.¿Cómo puedo crear un disco RAM programáticamente?

Gracias.

EDITAR

motivación: Tengo una biblioteca de terceros, que espera un nombre de directorio con el fin de procesar los archivos de ese directorio de una manera determinada. Tengo estos archivos comprimidos en un archivo. Deseo extraer el archivo en un disco RAM y pasarle la ruta al directorio correspondiente en ese disco RAM. Como puede ver, los archivos mapeados de memoria no me sirven.

+1

Si realmente considera RAM * disk *, no existe tal función 'CreateRAMDisk' en Windows. Creo que debe ver cómo crear un controlador para un disco, pero el disco se redirige a la memoria RAM. Sin embargo, si desea simplemente redirigir archivos a la memoria, usar el archivo mapeado en memoria hará la tarea. – minjang

+0

Edité mi pregunta. – mark

+0

posible duplicado de [API programable Disco RAM para .NET?] (Http://stackoverflow.com/questions/2402888/programmable-ram-disk-api-for-net) –

Respuesta

1

No hay API para crear un disco RAM de por sí. Debe escribir su propio controlador de dispositivo que presenta un nuevo disco en el sistema y hacer que ese controlador funcione con la memoria asignada.

EDITAR (después de edición de la OP)

Lo que estamos tratando de hacer lo que normalmente se realiza utilizando el directorio 'temp', que se supone que residen en el disco más rápida disponible en el sistema. Entonces, un sistema que ya tiene un RAMdisk probablemente tendrá su variable de entorno temp ya configurada para apuntar a una carpeta en el RAMdisk, y los sistemas sin un disco RAM simplemente tomarían la penalización de rendimiento, es su problema.

Ahora, si por alguna razón no puede confiar en la presencia de un RAMdisk en un sistema, Y absolutamente necesita el rendimiento más rápido posible, entonces no veo otra opción que instalar un tercero (quizás descargable libremente, tal vez incluso fuente abierta) Disco RAM, úselo temporalmente y luego desinstálelo. Pero eso es muy torpe.

+11

"escribir su propio controlador de dispositivo" es sinónimo de "virtualmente imposible" en mi opinión ... – mark

+3

Sí, creo que las personas de todo el mundo que se sentirían cómodas al realizar tal tarea probablemente encajen en una habitación. –

+1

¿Cuánto tiempo durará este tema? Resurrection of the RAMdisk -> The SSD .. – Karel

6

que aún no ha hablado de la lengua, por lo que mi respuesta está en C#:

un archivo asignado en memoria contiene el contenido de un archivo en la memoria virtual. Esta asignación entre un archivo y el espacio de memoria permite que una aplicación, incluidos múltiples procesos, modifique el archivo leyendo y escribiendo directamente en la memoria. A partir de la versión de .NET Framework 4, puede utilizar código administrado para acceder a archivos mapeados en memoria de la misma manera que las funciones nativas de Windows acceder a los archivos mapeados en memoria, como se describe en Administración de archivos asignados en memoria-Win32 en la biblioteca de 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 

// crear la vista del mapa y lo leyó:

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

Eso es un archivo de memoria asignada. No es un disco RAM. –

+0

@MikeNakis hay 'archivos mapeados en memoria no persistentes' y' archivos mapeados en memoria persistentes' http: // msdn.microsoft.com/en-us/library/dd997372.aspx –

+0

@MikeNakis 'Los archivos no persistentes son archivos mapeados en memoria que no están asociados con un archivo en un disco. –

27

ImDisk es una aplicación de disco RAM que crea una unidad virtual de un sector de la memoria, y tiene una API que se puede llamar desde .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

Excelente herramienta! –

+3

Después de haber probado tanto 'IMDisk' como' SoftPerfect RAM DIsk', prefiero 'SoftPerfect''. Tuvo un mejor rendimiento, solo reservé 0.2 MB de 100 MB asignados, frente a 10 MB para' IMDisk', y no requirió el 'User Indicador de control de cuentas (UAC) 'para montar unidades. Ambos admiten una opción persistente, pero lo probé. – Loathing

Cuestiones relacionadas