web-dev-qa-db-fra.com

Comment puis-je créer un disque RAM par programme?

Je ne cherche pas un code qui invoque un utilitaire de ligne de commande, qui fait l'affaire. Je suis en fait intéressé de connaître l'API utilisée pour créer un disque RAM.

MODIFIER

Motivation: J'ai une bibliothèque tierce qui attend un nom de répertoire afin de traiter les fichiers dans ce répertoire d'une certaine manière. J'ai ces fichiers zippés dans une archive. Je souhaite extraire l'archive dans un disque RAM et transmettre au tiers le chemin vers le répertoire correspondant sur ce disque RAM. Comme vous pouvez le voir, - les fichiers mappés en mémoire ne me sont d'aucune utilité.

28
mark

Il n'y a pas d'API pour créer un disque RAM en soi. Vous devez écrire votre propre pilote de périphérique qui présente un nouveau disque au système et faire fonctionner ce pilote de périphérique avec la mémoire allouée.

EDIT (après l'édition du PO)

Ce que vous essayez de faire serait normalement fait en utilisant le répertoire 'temp', qui est censé résider sur le disque le plus rapide disponible sur le système. Ainsi, un système qui a déjà un RAMdisk aura probablement sa variable d'environnement temporaire déjà définie pour pointer vers un dossier sur le RAMdisk, et les systèmes sans RAMdisk prendraient simplement la pénalité de performance, c'est leur problème.

Maintenant, si pour une raison quelconque, vous ne pouvez pas compter sur la présence d'un disque RAM sur un système ET que vous avez absolument besoin des performances les plus rapides possibles, je ne vois pas d'autre option que d'installer un tiers (peut-être téléchargeable gratuitement, peut-être même open source) RAM disque, utilisez-le temporairement, puis désinstallez-le. Mais c'est très maladroit.

1
Mike Nakis

ImDisk est une application de disque RAM qui crée un lecteur virtuel à partir d'un secteur de mémoire et possède une API qui peut être appelée à partir de .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;
    }
}
30
Robinicks

vous n'avez pas mentionné la langue, donc ma réponse est en c #:

Un fichier mappé en mémoire contient le contenu d'un fichier dans la mémoire virtuelle. Ce mappage entre un fichier et un espace mémoire permet à une application, comprenant plusieurs processus, de modifier le fichier en lisant et en écrivant directement dans la mémoire. À partir de la version 4 de .NET Framework, vous pouvez utiliser du code managé pour accéder aux fichiers mappés en mémoire de la même manière que les fonctions Windows natives accèdent aux fichiers mappés en mémoire, comme décrit dans Gestion des fichiers mappés en mémoire dans Win32 dans la bibliothèque 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

// Créez la vue de la carte et lisez-la:

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

WinFsp vous permet de définir votre propre système de fichiers par programmation, en utilisant du c ++ simple ou également dotNet C #. L'exemple de projet est un système de fichiers persistant dans le système d'exploitation RAM mémoire . Vous pouvez également consulter Dokany .

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

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

0
rodix