返回

如何获取Windows中文件的真实路径?

windows

Windows中获取文件真实路径:使用GetFinalPathNameByHandle

简介

在开发跨平台应用程序时,文件路径大小写敏感性可能会带来挑战。Windows文件系统对大小写不敏感,而Linux文件系统对大小写敏感。这可能会导致在不同操作系统上对文件路径处理不一致。

问题:大小写敏感的文件路径

在涉及文件操作时,确保在不同操作系统上始终使用正确的大小写文件路径至关重要。错误大小写可能会导致文件找不到或操作失败。

解决方案:GetFinalPathNameByHandle

在Windows操作系统中,GetFinalPathNameByHandle函数为我们提供了获取文件真实路径的解决方案。该函数接受一个文件句柄,并返回一个包含文件真实路径的缓冲区。

使用GetFinalPathNameByHandle

要使用GetFinalPathNameByHandle函数:

  1. 获取文件句柄: 使用诸如CreateFile之类的函数打开文件并获取其句柄。
  2. 分配缓冲区: 分配一个足够大的缓冲区来存储真实路径。
  3. 调用函数: 使用GetFinalPathNameByHandle函数,将文件句柄、缓冲区及其大小作为参数传递。
  4. 获取真实路径: 函数将返回文件真实路径的长度。然后,您就可以从缓冲区中检索路径。
  5. 关闭文件句柄: 使用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函数可在网络共享驱动器上使用。