如何获取Windows中文件的真实路径?
2024-03-15 00:58:24
Windows中获取文件真实路径:使用GetFinalPathNameByHandle
简介
在开发跨平台应用程序时,文件路径大小写敏感性可能会带来挑战。Windows文件系统对大小写不敏感,而Linux文件系统对大小写敏感。这可能会导致在不同操作系统上对文件路径处理不一致。
问题:大小写敏感的文件路径
在涉及文件操作时,确保在不同操作系统上始终使用正确的大小写文件路径至关重要。错误大小写可能会导致文件找不到或操作失败。
解决方案:GetFinalPathNameByHandle
在Windows操作系统中,GetFinalPathNameByHandle
函数为我们提供了获取文件真实路径的解决方案。该函数接受一个文件句柄,并返回一个包含文件真实路径的缓冲区。
使用GetFinalPathNameByHandle
要使用GetFinalPathNameByHandle
函数:
- 获取文件句柄: 使用诸如
CreateFile
之类的函数打开文件并获取其句柄。 - 分配缓冲区: 分配一个足够大的缓冲区来存储真实路径。
- 调用函数: 使用
GetFinalPathNameByHandle
函数,将文件句柄、缓冲区及其大小作为参数传递。 - 获取真实路径: 函数将返回文件真实路径的长度。然后,您就可以从缓冲区中检索路径。
- 关闭文件句柄: 使用
CloseHandle
函数关闭文件句柄以释放资源。
注意事项
GetFinalPathNameByHandle
函数返回的是一个规范化的路径,这意味着它已解析了任何符号链接。- 始终使用
CloseHandle
函数关闭文件句柄以释放系统资源。
示例代码
#include <iostream>
#include <windows.h>
int main() {
HANDLE hFile = CreateFile("Foo.cpp", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
char fullFilename[MAX_PATH];
DWORD len = GetFinalPathNameByHandle(hFile, fullFilename, MAX_PATH, FILE_NAME_NORMALIZED);
if (len == 0) {
std::cerr << "Error getting real path" << std::endl;
CloseHandle(hFile);
return 1;
}
CloseHandle(hFile);
std::cout << fullFilename << std::endl;
return 0;
}
结论
GetFinalPathNameByHandle
函数是一个有用的工具,可用于在Windows中获取文件真实路径,这对于确保跨平台文件操作一致性至关重要。
常见问题解答
1. GetFinalPathNameByHandle
函数在所有Windows版本中都可用吗?
是的,GetFinalPathNameByHandle
函数自Windows 95以来一直可用。
2. 返回的路径是否绝对路径?
是的,返回的路径是绝对路径。
3. 如何处理非常长的路径?
GetFinalPathNameByHandle
函数支持非常长的路径(超过MAX_PATH
)。如果路径超过缓冲区大小,函数会返回ERROR_INSUFFICIENT_BUFFER
错误,并通过len
参数返回所需的缓冲区大小。
4. 返回的路径是否包含文件扩展名?
是的,返回的路径包含文件扩展名。
5. GetFinalPathNameByHandle
函数在网络共享驱动器上是否有效?
是的,GetFinalPathNameByHandle
函数可在网络共享驱动器上使用。