2010-09-20 22 views
23

Wie kann ich eine virtuelle Festplatte (wie Z :) erstellen, die ihre Dateien auf einer physischen Festplatte speichert (wie C: \ Files).Erstellen einer virtuellen Festplatte

+1

durch einen Gerätetreiber zu schreiben. Etwas, was du nicht mit C# machen kannst. – dtb

+0

Kein Experte, aber es sieht so aus, als müssten Sie mit DDK auf Kernel-Ebene arbeiten. – LatinSuD

+2

@dtv & LatinSuD, dies erfordert definitiv kein virtuelles Dateisystem zu erstellen, können Sie einfach ein Laufwerk auf lokale Pfade zuordnen. – mikerobi

Antwort

42

Hier ist C# -Code dies direkt zu tun:

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); 
} 

Verwendungsbeispiel:

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

funktioniert das in Windows 10? kann es nicht funktionieren – Kubi

+0

Wenn der Benutzer den Laufwerksbuchstaben einer Festplatte eingibt, wird 'sb' etwas wie' \ Device \ HarddiskVolume2' enthalten und der 'Substring (4)' wird im Grunde Müll ausgeben. Ich würde vorschlagen, sicherzustellen, dass 'sb' mit' @ "\ ?? \" 'beginnt, bevor der' Substring (4) 'zurückgegeben wird. Wenn es mit etwas anderem beginnt, erscheint '' '' (dasselbe, das Sie zurückgeben, wenn das Laufwerk überhaupt nicht existiert), scheint ein vernünftiger Wert zu sein - es gibt kein SUBSTed-Laufwerk, um den Pfad zu erhalten. –

+0

@Hans Passant: Der obige Code zeigt keine Wirkung, wenn die Anwendung unter Admin-Berechtigungen ausgeführt wird. Dh 'Run As Admin' hat es in Windows 8 und Windows 10 auch versucht, jedoch ohne Admin-Berechtigungen zeigt der Code die erwarteten Ergebnisse an, eine Frage zum Thema hier gestellt, zu schätzen, wenn Sie einen Blick auf https: // stackoverflow werfen .com/q/46663368/323339 –

10

Sie können den Befehl subst verwenden. Verwenden Sie System.Diagnostic.Process, um die Datei subst.exe mit den gewünschten Parametern auszuführen. Hier

ist die Befehlssyntax:

Syntax

Associates ein Pfad mit einem Laufwerksbuchstaben.

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

Laufwerk1: ein virtuelles Laufwerk auf , die Sie einen Pfad zuweisen möchten.

[Laufwerk2:] Pfad Gibt ein physisches Laufwerk und Pfad an, den Sie einem virtuellen Laufwerk zuweisen möchten.

/D Löscht ein substituiertes (virtuelles) Laufwerk.

Geben Sie SUBST ohne Parameter ein, um eine Liste der aktuellen virtuellen drives.list der aktuellen virtuellen Laufwerke anzuzeigen.

+1

Nur damit Sie wissen, dies ist vielleicht eine der einfachsten Methoden. Wenn Sie den Computer neu starten, wird jedoch die Bereitstellung zurückgesetzt und das virtuelle Laufwerk entfernt und alles wieder normalisiert. Wenn Sie den Eintrag zur Datei autoexec.bat hinzufügen, kann das virtuelle Laufwerk während des Neustarts beibehalten werden. –

+0

@Ranhiru, Sie haben Recht, das virtuelle Laufwerk wird bei jedem Start zurückgesetzt. Eine einfache Lösung ist, dass das Programm den Befehl subst an jedem Startpunkt aufruft. –

+0

In Windows 7/64, was ist der beste Weg, um eine dauerhafte "subst" zu machen, die von allen Prozessen gesehen werden? – supercat

1

Tun Sie das genauso, wie Sie ein Netzlaufwerk zuordnen würden, aber zeigen Sie es auf einen Ordner auf dem aktuellen Computer. Sie müssen nur einen UNC-Pfad für den lokalen Ordner angeben.

Hier ist ein helper class

-1

nicht sicher, wie dies in C# zu tun, aber das sollte Ihnen helfen:

Ive dies nur getestet und funktioniert perfekt

Auf meinem Computer hat 1 Festplatte entwickelt, in 2, C: & D:, in D: gehen, ich habe einen Ordner-Backup, wenn Sie einen Rechtsklick auf den Ordner und klicken Sie auf die Share Tab genannt, werden Sie Network Path .. Auf meinem PC sehen, es sieht aus wie \\Robert-home\backup

Ich fuhr dann fort zu CMD und ausgeführt, um den folgenden Befehl

NET USE Z: \\Robert-home\backup 

Witch Karte erfolgreich den Inhalt D:\backup zu Z:

Ich bin sicher, Sie eine solche Aufgabe in C# abschließen können ..

Normalerweise verwende ich diese Methode bei der Arbeit für die Client-Unterstützung, um Dateien zu übertragen und zu sichern, bevor neue Konsolen an sie ausgegeben werden.

Verwandte Themen