2010-03-08 18 views
11

Buscando una API de disco RAM (o un conjunto equivalente de software para implementar) para almacenar archivos temporalmente para operaciones de lectura/escritura fuera del entorno físico del disco duro.API de disco RAM programable para .NET?

actualización Los archivos Exe se escribirán en el disco RAM y se ejecutarán.

+0

eliminado "rápida" de la pregunta - Creo que las personas llevan por mal camino - que es mucho más claro ahora –

Respuesta

7

Un "disco RAM" es una construcción de nivel de sistema operativo, porque tiene que implementar un sistema de archivos y un controlador de dispositivo para emular un disco. No puedes hacer esto a nivel de biblioteca.

Si desea seguir el nivel del sistema operativo, Windows viene con un controlador incorporado ramdisk.sys.

De lo contrario, leer los archivos en una estructura de datos en su aplicación tendrá las mismas características de rendimiento que usar un disco RAM. Normalmente, se utiliza un disco RAM cuando la aplicación desconoce el hecho de que se está ejecutando fuera de los archivos almacenados en caché RAM. Si su aplicación es consciente del hecho de que desea hacerlo, simplemente lea los datos en su aplicación directamente.

+0

Es un ejecutable que debe ser puesto en marcha, no estándar de datos en sí. El controlador ramdisk.sys suena interesante ... –

+0

Esta parece ser la mejor manera, aunque tengas razón, no es tan simple como yo deseaba. –

3

ramdisk.sys es un controlador que puede obtener de Microsoft como una demo de controlador pero aparentemente no se garantiza que funcione en Windows 7, así que buena suerte con eso. Puede encontrar otras implementaciones de ramdisk, pero luego debe instalarlas, lo que significa que debe modificar su disco (es decir, Paso 1: instalar un controlador incompleto).

Así que esto plantea la pregunta de qué estás tratando de hacer realmente. Si su objetivo es crear un entorno limitado para algunos ejecutables para que no puedan escribir en las unidades locales, esto no suena como el enfoque correcto. Si el objetivo es hacer que un pequeño conjunto de ejecutables esté disponible para que funcionen rápidamente, de nuevo, este no parece ser el enfoque correcto: Windows almacena en caché los ejecutables DE TODOS MODOS, por lo que el segundo lanzamiento es más rápido. Si el objetivo es crear un área pequeña y fácil de limpiar para ejecutables, se supone que el directorio temporal de Windows es el lugar para eso. Si intentas hacer un sistema como utilidades norton o fantasma que brinden acceso sin restricciones al disco duro sin dejar rastro, me pregunto si .NET es o no el camino correcto para eso, ya que .NET va a estar golpeando tu HD duro y pesado de todos modos. Si su objetivo es crear un virus o un caballo de Troya que oculte su carga útil en un disco RAM, cuestiono sus motivos.

¿Qué estás realmente tratando de hacer?

Otra opción en lugar de un ramdisk es Dokan, que es un controlador del sistema de archivos en modo de usuario. Hacer una unidad en la memoria es simple: hice una aplicación .NET rápida que hacía que los escáneres TWAIN aparecieran como unidades como una demostración, pero descubrí que el dokan, en el momento en que lo usaba, hacía que mi máquina frágil: cualquier Un paso en falso mientras trabajaba significaba un viaje para reiniciar la tierra. Y nuevamente, requiere la instalación de un controlador. Espero que esto haya mejorado.

+1

Mi motivo es la curiosidad pura basada en esta pregunta - http://stackoverflow.com/questions/2383400/net-embed-an-exe-file-into-my-project y, si es factible, podría probarlo para su implementación motivo. –

3

ImDisk es una aplicación de disco RAM que crea una unidad virtual desde un sector de memoria y tiene una API a la 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; 
    } 
} 
Cuestiones relacionadas