2010-09-20 181 views
23

如何创建将物理硬盘上的文件存储在其中的虚拟硬盘驱动器(如Z :)(如C:\ Files)。创建虚拟硬盘驱动器

+1

通过编写设备驱动程序。你不能用C#做的事情。 – dtb 2010-09-20 17:15:38

+0

不是专家,但它看起来像你需要在内核级别与DDK一起工作。 – LatinSuD 2010-09-20 17:15:51

+2

@dtv&LatinSuD,这绝对不需要创建虚拟文件系统,您可以轻松将驱动器映射到本地路径。 – mikerobi 2010-09-20 17:25:26

回答

42

下面是C#代码直接做到这一点:

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

使用范例:

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

这是在Windows 10中的工作?无法使其工作 – Kubi 2017-05-16 07:40:36

+0

如果用户传入硬盘的驱动器号,'sb'将包含类似'\ Device \ HarddiskVolume2'的东西,而'Substring(4)'将基本上返回垃圾。我建议在返回'Substring(4)'之前确保'sb'以'@“\ ?? \”开头。如果它以别的方式开始,那么''''(如果驱动器根本不存在,则返回相同的东西)似乎是一个合理的值 - 返回 - 没有SUBSTed驱动器来获取路径。 – 2017-07-02 20:46:39

+0

@Hans Passant:当应用程序以管理员权限运行时,上述代码不会显示任何效果。即'运行管理员'尝试它在Windows 8和Windows 10,但是,没有管理员权限它的代码将显示预期的结果,在这里发布的相关主题的问题,感谢您看看https:// stackoverflow的.com/q /323339分之46663368 – 2017-10-10 13:07:00

10

您可以使用subst命令。 使用System.Diagnostic.Process以期望的参数运行subst.exe。

下面是命令语法:

语法

相关联的一个盘符路径。

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

DRIVE1:指定一个虚拟驱动器您要指定一个路径 。

[drive2:] path指定要分配给 虚拟驱动器的物理驱动器和路径 。

/D删除 替代(虚拟)驱动器。

键入不带参数的SUBST以显示当前虚拟驱动器的当前虚拟驱动器列表 列表。

+1

只要你知道,这也许是最简单的方法。但是,重新启动计算机将恢复安装并删除虚拟驱动器,并将所有内容恢复正常。如果将条目添加到autoexec.bat文件,虚拟驱动器可以在整个重新启动过程中保留。 – 2010-09-20 17:49:17

+0

@Ranhiru,你是对的,虚拟驱动器将在每次启动时恢复。一个简单的解决方案是程序在启动时会调用subst命令。 – 2010-09-20 17:57:09

+0

在Windows 7/64中,做所有进程都能看到的永久“subst”的最佳方式是什么? – supercat 2010-11-02 14:49:35

1

完成与网络驱动器映射完全相同的操作,但将其指向当前机器上的文件夹。你必须做的唯一事情就是使用本地文件夹的UNC路径。

这里是一个helper class

-1

不知道如何在C#中做到这一点,但是这应该可以帮助您:

我刚试用了完美的作品

在我的电脑有1个硬盘驱动器设计成2,C: & D:,进入D:我有一个名为Backup的文件夹,如果你右键点击该文件夹并点击Share标签,你会看到Network Path ..在我的电脑上它看起来像\\Robert-home\backup

我接着就CMD并执行以下命令

NET USE Z: \\Robert-home\backup 

女巫D:\backup内容成功地映射到Z:

我肯定可以完成C#中这样的任务..

我通常在工作中使用这种方法来支持客户端在新控制台发布之前传输和备份文件。