c# - 如何访问隐藏的分区/卷

标签 c# c++ winapi wmi disk-partitioning

我必须使用 C# 或 C++ 编写代码来访问隐藏的磁盘分区/卷。 但找不到任何关于此事的帮助引用。

作为隐藏卷,它不包含“磁盘号”,因此您不能只键入“C:\”并访问它。 一个例子是 Windows 附带的“恢复分区”。你在资源管理器上看不到它,但它就在那里。

我的应用程序将从 thoose 分区写入和读取数据,我必须找到一种方法来为 thoose 执行类似“c:\”的操作。

Volumes 5,6 are hidden partitions

在上图中,卷 5 和 6 是隐藏分区。 我在 stackoverflow 上找到了这个链接,但它只“列出”了分区: https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx

编辑

问题是:即使按照建议使用 WMI,我也找不到在查找文件时如何过滤卷。 例如,select * from win32_DataFile 将列出机器中的所有文件。

我认为应该是一种使用卷的 ID(或名称)过滤卷的方法。 像这样的东西:

select * from win32_DataFile 
where volumeId = '\\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\'

或者更漂亮的方式,比如:

var files = Directory.GetFiles(@"\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");

此外,我在关于分区和卷(它们不是一回事)中找到了一个优秀的 awenser https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how-do-i-find-the-partition-guid?forum=winservergen

EDIT2

正如 Harry 所说,使用“\.\Volume...”是恢复文件的好方法。但是我找不到使用 C# 编写(创建)新文件的方法。 迄今为止最好的方法是使用 pinvoke 到 c++ CreateFile 方法/句柄。


有什么建议吗?

最佳答案

FindFirstVolume() API返回系统上每个卷的根路径。

例如,此代码打印第一个卷的路径,以及该卷根目录中第一个文件的名称:

    HANDLE h1, h2;
    wchar_t volpath[4096];
    WIN32_FIND_DATA find_data;

    h1 = FindFirstVolume(volpath, _countof(volpath));

    printf("%ws\n", volpath);

    wcscat_s(volpath, _countof(volpath), L"*.*");

    h2 = FindFirstFile(volpath, &find_data);

    printf("%ws\n", find_data.cFileName);

(在生产代码中,您需要添加错误检查等)

附录

FindFirstVolume 返回如下路径:\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\

如果您在 C++ 中使用 Win32 API(CreateFile 等),您可以直接使用该路径,但由于 .NET 中的错误或限制,它不适用于 Directory.GetFiles 等文件管理类(). (当然,您可以 P/Invoke 到 Win32 API,但这很尴尬。)

相反,您可以通过将出现在路径开头的问号替换为点来解决此问题:

var files = Directory.GetFiles(@"\\.\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");

关于c# - 如何访问隐藏的分区/卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30988603/

相关文章:

c++ - 在 C++ 中调用包含在类中的方法,并在 main 中调用变量和函数

c++ - 字体更改后更新文本字段 (Win32)

winapi - 包装器和框架有什么区别?

c# - 在 ASP.NET Webforms 应用程序的 web.config 中加载多个用户控件应用程序是个坏主意

c# - 将位图转换为图标

c++ - 读取PNG header 的宽度和高度

通过模板的 C++ 类说明符alignas 选项

c# - Entity Framework 获取单个项目真的很慢

c# - 如何让DataGrid整体单站关注方向键行选择遍历?

windows - QueryUnbiasedInterruptTime 是单调的吗?