2010-09-20 22 views
23

cómo puedo crear discos duros virtuales (como Z :) que almacenan sus archivos en el disco duro físico (como C: \ Files).creando discos duros virtuales

+1

Al escribir un controlador de dispositivo. Algo que no puedes hacer con C#. – dtb

+0

No es experto, pero parece que necesita trabajar a nivel de kernel con DDK. – LatinSuD

+2

@dtv & LatinSuD, esto definitivamente no requiere la creación de un sistema de archivos virtual, puede asignar fácilmente un disco a las rutas locales. – mikerobi

Respuesta

42

Aquí es código C# para hacerlo directamente: el uso

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

muestra:

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

¿funciona esto en Windows 10? no puede hacer que funcione – Kubi

+0

Si el usuario pasa en la letra de unidad de un disco duro, 'sb' contendrá algo como' \ Device \ HarddiskVolume2' y el 'Subcadena (4)' básicamente devolverá basura. Sugeriría asegurarse de que 'sb' comience con' @ "\ ?? \" 'antes de devolver' Substring (4) '. Si comienza con otra cosa, '" "' (lo mismo que devuelve si la unidad no existe en absoluto) parece un valor razonable para devolver; no hay ninguna unidad SUBSTed para obtener la ruta de acceso. –

+0

@ Hans Passant: el código anterior no mostrará ningún efecto cuando la aplicación se ejecuta bajo permisos de administrador. es decir, 'Run As Admin' lo intentó en Windows 8 y Windows 10 también, sin embargo, sin permisos de administrador, el código mostrará los resultados esperados, una pregunta publicada relacionada con el tema aquí, aprecia si miras https: // stackoverflow .com/q/46663368/323339 –

10

Puede usar el comando subst. Use System.Diagnostic.Process para ejecutar el subst.exe con los parámetros deseados.

Aquí se muestra la sintaxis de comandos:

Sintaxis

Associates un camino con una letra de unidad.

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

unidad1: Especifica una unidad virtual para la que desea asignar una ruta.

[unidad2:] ruta Especifica una unidad física y la ruta que desea asignar a una unidad virtual .

/D Elimina una unidad sustituida (virtual) .

Escriba SUBST sin parámetros para mostrar una lista de unidades virtuales actuales. Lista de unidades virtuales actuales.

+1

Para que lo sepas, esto quizás sea uno de los métodos más fáciles. Sin embargo, reiniciar la computadora revertirá la montura y eliminará la unidad virtual y todo volverá a la normalidad. Si agrega la entrada al archivo autoexec.bat, la unidad virtual se puede retener durante los reinicios. –

+0

@Ranhiru, tienes razón, la unidad virtual se revertirá en cada arranque. Una solución fácil es que el programa invoque el comando subst siempre que comience. –

+0

En Windows 7/64, ¿cuál es la mejor manera de hacer un "subst" permanente que será visto por todos los procesos? – supercat

1

Hágalo de la misma manera que lo haría con una unidad de red, pero apúntela a una carpeta en la máquina actual. Lo único que debe hacer especial es usar una ruta UNC para la carpeta local.

Aquí es una helper class

-1
No

seguro de cómo hacer esto en C#, pero esto le ayudará a:

Acabo probado esto y funciona perfecto

En mi computadora, tienen 1 disco duro ideado en 2, C: & D:, yendo a D: tengo una carpeta llamada Copia de seguridad, si hace clic derecho en la carpeta y hace clic en la pestaña Share, verá Network Path .. En mi pc se ve como \\Robert-home\backup

entonces procedió a CMD y ejecutado el comando siguiente

NET USE Z: \\Robert-home\backup 

bruja mapear el contenido de D:\backup a Z:

Estoy seguro de que puede completar una tarea tan dentro de C# ..

Usualmente uso este método en el trabajo para la asistencia del cliente para transferir y hacer copias de seguridad de los archivos antes de que se les envíen nuevas consolas.