硬盘卷路径到完整文件路径

2023-12-06

我有一个 MSVC++ 应用程序,它以以下字符串格式输出其他应用程序打开的文件句柄的硬盘卷路径:

\Device\HarddiskVolume4\Users\User\Documents\Visual Studio 2013\Projects\FileLocker\FileLocker\bin\Debug\Test.txt

我想将这些路径转换为 ​​Windows 中这些文件的完整路径。例如,我想将上面的硬盘卷路径转换为完整的Windows文件路径及其相应的驱动器号:

C:\Users\User\Documents\Visual Studio 2013\Projects\FileLocker\FileLocker\bin\Debug\Test.txt

我在网上查看过,但没有找到任何以编程方式执行此操作的明确资源。如何做呢?


您应该寻找用于卷管理的 Windows API 函数之一:

卷管理功能

这是来自 MSDN 的示例:

显示卷路径

#include <windows.h>
#include <stdio.h>

void DisplayVolumePaths(
        __in PWCHAR VolumeName
        )
{
    DWORD  CharCount = MAX_PATH + 1;
    PWCHAR Names     = NULL;
    PWCHAR NameIdx   = NULL;
    BOOL   Success   = FALSE;

    for (;;) 
    {
        //
        //  Allocate a buffer to hold the paths.
        Names = (PWCHAR) new BYTE [CharCount * sizeof(WCHAR)];

        if ( !Names ) 
        {
            //
            //  If memory can't be allocated, return.
            return;
        }

        //
        //  Obtain all of the paths
        //  for this volume.
        Success = GetVolumePathNamesForVolumeNameW(
            VolumeName, Names, CharCount, &CharCount
            );

        if ( Success ) 
        {
            break;
        }

        if ( GetLastError() != ERROR_MORE_DATA ) 
        {
            break;
        }

        //
        //  Try again with the
        //  new suggested size.
        delete [] Names;
        Names = NULL;
    }

    if ( Success )
    {
        //
        //  Display the various paths.
        for ( NameIdx = Names; 
              NameIdx[0] != L'\0'; 
              NameIdx += wcslen(NameIdx) + 1 ) 
        {
            wprintf(L"  %s", NameIdx);
        }
        wprintf(L"\n");
    }

    if ( Names != NULL ) 
    {
        delete [] Names;
        Names = NULL;
    }

    return;
}

void __cdecl wmain(void)
{
    DWORD  CharCount            = 0;
    WCHAR  DeviceName[MAX_PATH] = L"";
    DWORD  Error                = ERROR_SUCCESS;
    HANDLE FindHandle           = INVALID_HANDLE_VALUE;
    BOOL   Found                = FALSE;
    size_t Index                = 0;
    BOOL   Success              = FALSE;
    WCHAR  VolumeName[MAX_PATH] = L"";

    //
    //  Enumerate all volumes in the system.
    FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName));

    if (FindHandle == INVALID_HANDLE_VALUE)
    {
        Error = GetLastError();
        wprintf(L"FindFirstVolumeW failed with error code %d\n", Error);
        return;
    }

    for (;;)
    {
        //
        //  Skip the \\?\ prefix and remove the trailing backslash.
        Index = wcslen(VolumeName) - 1;

        if (VolumeName[0]     != L'\\' ||
            VolumeName[1]     != L'\\' ||
            VolumeName[2]     != L'?'  ||
            VolumeName[3]     != L'\\' ||
            VolumeName[Index] != L'\\') 
        {
            Error = ERROR_BAD_PATHNAME;
            wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s\n", VolumeName);
            break;
        }

        //
        //  QueryDosDeviceW does not allow a trailing backslash,
        //  so temporarily remove it.
        VolumeName[Index] = L'\0';

        CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, ARRAYSIZE(DeviceName)); 

        VolumeName[Index] = L'\\';

        if ( CharCount == 0 ) 
        {
            Error = GetLastError();
            wprintf(L"QueryDosDeviceW failed with error code %d\n", Error);
            break;
        }

        wprintf(L"\nFound a device:\n %s", DeviceName);
        wprintf(L"\nVolume name: %s", VolumeName);
        wprintf(L"\nPaths:");
        DisplayVolumePaths(VolumeName);

        //
        //  Move on to the next volume.
        Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName));

        if ( !Success ) 
        {
            Error = GetLastError();

            if (Error != ERROR_NO_MORE_FILES) 
            {
                wprintf(L"FindNextVolumeW failed with error code %d\n", Error);
                break;
            }

            //
            //  Finished iterating
            //  through all the volumes.
            Error = ERROR_SUCCESS;
            break;
        }
    }

    FindVolumeClose(FindHandle);
    FindHandle = INVALID_HANDLE_VALUE;

    return;
}

澄清:

卷名称(或 GUID)类似于\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

设备名称类似于\Device\HarddiskVolume1

驱动器号是这样的C:

FindFirst/NextVolume为您提供卷名称列表。

QueryDosDevice为您提供来自卷名称的设备名称。

GetVolumePathNamesForVolumeName为您提供卷名称中的驱动器盘符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

硬盘卷路径到完整文件路径 的相关文章

  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • MongoDB 文本搜索和排序依据

    我们正在使用 MongoDB 的文本搜索 到目前为止效果很好 但是 我们还想指定结果的顺序 例如 db items runCommand text search test item orderby votes 1 这个执行了 但它不按投票排
  • 在 ubuntu 12.04 aws ec2 上安装 gem 时出错

    我在 AWS EC2 中有一个 Ubuntu 12 04 实例 我只想宝石安装rails 但它显示此错误消息 这是由于 sudo gem env 之间的 gem env 差异引起的吗 除了rvm implode之外还有什么办法可以解决这个问
  • 再次更新JFrame

    下面显示的代码将向 JFrame 添加 3 个 JLabel 然后删除这 3 个 JLabel 2 秒后 它将重新绘制 3 个 JLabels import javax swing JFrame import javax swing JLa
  • Angular 5 FormArray 从数据库获取数据并显示行

    我只是角度的新手 我创建了一个事件组件 用户在其中输入带有包的事件名称 当用户创建事件时 它具有通过添加和删除行创建多个包的功能 为此我用过FormArray 这里一切都很好 但是 当我尝试在事件编辑组件中获取这些值时 我获取了事件名称的值
  • 等待承诺链有什么问题?

    我正在开发 Angular 6 应用程序 有人告诉我以下是反模式 await someFunction then result gt console log result 我意识到等待承诺链是没有意义的 如果 someFunction 返回
  • 尝试访问本地 LAMP 服务器上的 localhost 时出现 404 Not Found 错误

    我正在运行Ubuntu 我的 Apache2 默认文件如下所示
  • HTTP 错误 502.5 - 进程失败 asp.net core 2.0

    Problem 我已经开发了我的Web应用程序并使用asp net core 1 1将其发布到azure 它工作正常 直到我将我的Web应用程序升级到Core 2 0最终版本 现在该应用程序在本地工作 但是当我将其部署到Azure时它给了我
  • 如何读取.doc文件?

    我有一个 doc文件保存在我的sdcard 我需要阅读以下内容 doc文件并将其显示在TextView 谁能告诉我该怎么做吗 抱歉 是我的错 你需要这样做 public void onCreate Bundle b super onCrea
  • 从 JSON.parse 数组中获取数据

    我陷入了这个问题 我正在调用一个 webService 它返回一个 json 响应 现在我想从该响应中获取特定的值 但在互联网上搜索并努力挣扎后无法修复它 这是我的代码 var xhr Titanium Network createHTTP
  • 如何将参数传递给通过 Start-Job 调用的 PS 脚本?

    我想使用 start job 运行需要参数的 ps1 脚本 这是脚本文件 Test Job ps1 Param Parameter Mandatory True String input output input to output ret
  • 无法使用不记名令牌访问 AAD 安全 Web API

    我有一个使用 Azure AD AAD 保护的 API 应用程序 我还有一个用于消费应用程序的 AAD 应用程序 并且在消费应用程序中我设置了访问 API 应用程序的权限 我能够获取令牌 但是当我使用令牌时 API 应用程序似乎不会查看授权
  • 如何向 Windows 资源管理器添加“在此处打开 git-bash...”上下文菜单?

    如何向 Windows 资源管理器添加上下文 也称为右键单击 菜单 单击该菜单时会在当前资源管理器文件夹中打开 git bash 控制台 步骤1 在桌面上右键单击 新建 gt 文本文档 名称为 OpenGitBash reg 步骤2 右键单
  • 阻止 Blob URL 过期

    我正在将图像上传到 blob 商店 我已经复制了这个例子 从here 我遇到的唯一问题是 如果我加载带有表单的页面 并且 不立即提交图像 该 URL 可能会过期 当我过期时 尝试加载图像我收到错误页面 我怎样才能检查是否 URL 已过期并在
  • Ansible with_subelements 嵌套级别

    我正在尝试迭代嵌套循环 就像这个问题一样 Ansible with subelements 不过 我需要更深入一些 那里的评论 日期为 2017 年 1 月 指出不支持额外的嵌套级别 现在还是这样吗 如果没有 我如何引用更深层次的内容 My
  • 我可以在单独的线程中运行 UIWebView 吗?

    我有一个运行 JavaScript 应用程序的 Web 视图 有时当主线程执行 xhr 调用和初始化视频播放器等较繁重的作业时 它会冻结 挂起 是否可以在单独的线程中运行 UIWebView 以避免 Web 视图被阻塞 UIWebView可
  • Google Actions - 使用访问令牌访问日历 API 失败

    我按照说明进行操作在这篇伟大的文章中 设置我的应用程序服务器和谷歌操作之间的帐户链接 在身份验证过程中 我请求 https www googleapis com auth calendar 范围许可 我设法通过调用在我的服务器上获取身份验证
  • 即使无法满足​​一致性,Cassandra 是否会写入节点(已启动)?

    Cassandra 文档中的以下声明是我怀疑的原因 例如 如果使用复制因子为 3 的 QUORUM 写入一致性级别 Cassandra 会将写入复制到集群中的所有节点 并等待两个节点的确认 如果写入在一个节点上失败 但在另一个节点上成功 C
  • SwiftUI Map() 视图错误:不允许从视图更新中发布更改,这将导致未定义的行为

    我正在尝试构建一个小型地图应用程序 其中用户的位置一直在变化 一般来说 我总是得到纬度和经度更新 我需要显示它们并用滑动动画显示变化 类似于Apple FindMyFriend 当它们在现场移动时它在地图上滑动 这是我的观点 struct
  • Android 中 USB 网络共享模式下 PC 的 IP 地址,无需 WIFI,以编程方式

    如何在不使用 WIFI 管理器的情况下以编程方式获取 Android 手机以 USB 网络共享模式连接的 PC 的 IP 地址 默认网关和端口号 我使用了网络接口 但它没有给我正确的信息 还有其他方法吗 for Enumeration
  • 硬盘卷路径到完整文件路径

    我有一个 MSVC 应用程序 它以以下字符串格式输出其他应用程序打开的文件句柄的硬盘卷路径 Device HarddiskVolume4 Users User Documents Visual Studio 2013 Projects Fi