创建虚拟硬盘

Posted

技术标签:

【中文标题】创建虚拟硬盘【英文标题】:creating virtual hard Drive 【发布时间】:2010-09-20 17:13:19 【问题描述】:

如何驱动器(如 Z:),将其文件存储在物理硬盘驱动器(如 C:\Files)上。

【问题讨论】:

通过编写设备驱动程序。用 C# 做不到的事情。 @dtv & LatinSuD,这绝对不需要创建虚拟文件系统,您可以轻松地将驱动器映射到本地路径。 虽然问题最好表述为“如何将本地文件夹挂载为虚拟硬盘?”我无法想象为什么这会遭到反对。 为什么close 投票,这是一个完全有效的问题? Ata,我不是说要关闭,我在问为什么其他人要求关闭,而这似乎是一个有效的问题! 【参考方案1】:

这是直接执行此操作的 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');

【讨论】:

如果用户传入硬盘的盘符,sb 将包含类似\Device\HarddiskVolume2 的内容,Substring(4) 基本上会返回垃圾。我建议确保sb@"\??\" 开头,然后再返回Substring(4)。如果它以其他东西开头,""(如果驱动器根本不存在,则返回相同的东西)似乎是一个合理的返回值 - 没有 SUBSTed 驱动器可以获取路径。 @Hans Passant:当应用程序在管理员权限下运行时,上面的代码不会显示任何效果。即Run As Admin 在 Windows 8 和 Windows 10 中也尝试过,但是,如果没有管理员权限,代码将显示预期结果,此处发布与主题相关的问题,如果您查看 ***.com/q/46663368/323339,将不胜感激 @Jalal 说:这种类型的映射只对运行命令的用户可见。如果您以管理员身份运行此驱动器,将为管理员映射驱动器。您必须以自己的身份运行它才能在会话中看到它。【参考方案2】:

您可以使用 subst 命令。 使用 System.Diagnostic.Process 运行带有所需参数的 subst.exe。

这里是命令语法:

语法

将路径与驱动器号相关联。

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

drive1:指定一个虚拟驱动器 您要为其分配路径。

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

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

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

【讨论】:

您知道,这可能是最简单的方法之一。但是,重新启动计算机将恢复安装并删除虚拟驱动器并使一切恢复正常。如果将条目添加到 autoexec.bat 文件中,则虚拟驱动器可以在重新启动期间保留。 @Ranhiru,你是对的,虚拟驱动器将在每次启动时恢复。一个简单的解决方案是程序在启动时会调用 subst 命令。 在 Windows 7/64 中,实现所有进程都能看到的永久“subst”的最佳方法是什么?【参考方案3】:

以与映射网络驱动器完全相同的方式执行此操作,但将其指向当前计算机上的文件夹。您唯一需要做的特别的事情是使用本地文件夹的 UNC 路径。

这是helper class

【讨论】:

【参考方案4】:

不确定如何在 C# 中执行此操作,但这应该对您有所帮助:

我刚刚测试过,效果很好

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

然后我转到CMD 并执行以下命令

NET USE Z: \\Robert-home\backup

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

我相信你可以在 C# 中完成这样的任务..

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

【讨论】:

以上是关于创建虚拟硬盘的主要内容,如果未能解决你的问题,请参考以下文章

创建虚拟硬盘

我用cmd创建了一个VHD(虚拟硬盘),现在想对它的大小修改,请问怎么修改。

linux虚拟机上添加虚拟硬盘并分区

虚拟硬盘都有哪些类型?

主机挂载虚拟机硬盘

我在HyperV中的创建的一个虚拟机,现在想给它添加以个硬盘D盘 怎么实现