2010-09-20 20 views
23

Come posso creare Virtual Hard Drive (come Z :) che memorizza i suoi file sul disco rigido fisico (come C: \ Files).creazione di un disco rigido virtuale

+1

Scrivendo un driver di periferica. Qualcosa che non puoi fare con C#. – dtb

+0

Non esperto ma sembra che tu debba lavorare a livello del kernel con DDK. – LatinSuD

+2

@dtv & LatinSuD, questo sicuramente non richiede la creazione di un file system virtuale, è possibile mappare facilmente un'unità ai percorsi locali. – mikerobi

risposta

42

Ecco codice C# per fare questo direttamente: l'utilizzo

using System; 
using System.Text; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

static class Subst { 
    public static void MapDrive(char letter, string path) { 
     if (!DefineDosDevice(0, devName(letter), path)) 
      throw new Win32Exception(); 
    } 
    public static void UnmapDrive(char letter) { 
     if (!DefineDosDevice(2, devName(letter), null)) 
      throw new Win32Exception(); 
    } 
    public static string GetDriveMapping(char letter) { 
     var sb = new StringBuilder(259); 
     if (QueryDosDevice(devName(letter), sb, sb.Capacity) == 0) { 
      // Return empty string if the drive is not mapped 
      int err = Marshal.GetLastWin32Error(); 
      if (err == 2) return ""; 
      throw new Win32Exception(); 
     } 
     return sb.ToString().Substring(4); 
    } 


    private static string devName(char letter) { 
     return new string(char.ToUpper(letter), 1) + ":"; 
    } 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool DefineDosDevice(int flags, string devname, string path); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern int QueryDosDevice(string devname, StringBuilder buffer, int bufSize); 
} 

Esempio:

 Subst.MapDrive('z', @"c:\temp"); 
     Console.WriteLine(Subst.GetDriveMapping('z')); 
     Subst.UnmapDrive('z'); 
+0

funziona in Windows 10? impossibile farlo funzionare – Kubi

+0

Se l'utente passa la lettera di unità di un disco rigido, 'sb' conterrà qualcosa come' \ Device \ HarddiskVolume2' e 'Substring (4)' fondamentalmente restituirà garbage. Suggerirei di fare in modo che 'sb' inizi con' @ "\ ?? \" 'prima di restituire' Substring (4) '. Se inizia con qualcos'altro, '" "' (la stessa cosa che si restituisce se l'unità non esiste affatto) sembra un valore ragionevole da restituire - non esiste un'unità SUBSTed per ottenere il percorso di. –

+0

@Hans Passant: il codice precedente non mostrerà alcun effetto quando l'applicazione viene eseguita con le autorizzazioni di amministratore. Ad esempio, "Esegui come amministratore" lo ha provato anche in Windows 8 e Windows 10, tuttavia, senza i permessi di amministratore, il codice mostrerà i risultati previsti, una domanda postata relativa all'argomento qui, apprezza se dai uno sguardo a https: // StackOverflow com/q/46663368/323339 –

10

È possibile utilizzare il comando subst. Utilizzare System.Diagnostic.Process per eseguire il file subst.exe con i parametri desiderati.

Ecco la sintassi del comando:

Sintassi

Associa un percorso con una lettera di unità.

SUBST [drive1: [drive2:]path] 
SUBST drive1: /D 

unità1: Specifica un'unità virtuale per quale si desidera assegnare un percorso.

Percorso [unità2:] Specifica un'unità fisica e il percorso che si desidera assegnare a un'unità virtuale .

/D Elimina un'unità (virtuale) sostituita.

Digitare SUBST senza parametri per visualizzare un elenco virtuale di drive.list correnti di unità virtuali attuali.

+1

Solo per quello che sai, forse è uno dei metodi più facili. Tuttavia, il riavvio del computer ripristinerà il montaggio e rimuoverà l'unità virtuale e rimetterà tutto alla normalità. Se si aggiunge la voce al file autoexec.bat, l'unità virtuale può essere mantenuta durante i riavvii. –

+0

@Ranhiru, hai ragione, l'unità virtuale verrà ripristinata ad ogni avvio. Una soluzione semplice è che il programma chiamerà il comando subst ogni volta che si avvia. –

+0

In Windows 7/64, qual è il modo migliore per eseguire una "subst" permanente che verrà visualizzata da tutti i processi? – supercat

1

Esegui esattamente come mappare un'unità di rete, ma indirizzarla a una cartella sulla macchina corrente. L'unica cosa che devi fare è usare un percorso UNC per la cartella locale.

Ecco un helper class

-1
Non

sicuro di come fare questo in C#, ma questo dovrebbe aiutare a:

Ive ha appena testato questa e funziona perfettamente

Sul mio computer hanno 1 disco rigido messo a punto in 2, C: & D:, entrando in D: ho una cartella denominata Backup, se si fa clic destro sulla cartella e si fa clic sulla scheda Share, vedrete Network Path .. Sul mio pc sembra \\Robert-home\backup

ho poi proceduto a CMD e giustiziati il ​​seguente comando

NET USE Z: \\Robert-home\backup 

Strega associare correttamente i contenuti di D:\backup a Z:

Sono sicuro che è possibile completare un tale compito all'interno di C# ..

Di solito utilizzo questo metodo al lavoro per il supporto client per trasferire e fare il backup dei file prima che vengano rilasciate nuove console.

Problemi correlati