gpt4 book ai didi

c++ - 硬盘卷路径到完整文件路径

转载 作者:可可西里 更新时间:2023-11-01 09:59:00 25 4
gpt4 key购买 nike

我有一个 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 函数之一:

Volume Management Functions

这是来自 MSDN 的示例:

Displaying Volume Paths

#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 为您提供卷名中的驱动器号。

关于c++ - 硬盘卷路径到完整文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com