【发布时间】:2018-03-02 12:04:43
【问题描述】:
因为在 Windows 中,使用 Visual Studio,__FILE__ 宏可以提供小写字符串,并且因为我需要知道正确大小写的文件名(用户认为),所以我正在尝试解决如何转换Windows 上到正确大小写的路径的全小写路径。
看起来使用 stat 获取有关文件的信息可能是一个很好的起点。
但是,给定一个 stat 对象,我如何获取文件名?
#include <sys/stat.h>
#include <string>
void test()
{
std::string file_name = "C:\\WiNdoWs";
struct stat statbuf;
int stat_ok = stat(file_name.c_str(), &statbuf);
auto file_serial_number = statbuf.st_ino;
std::string full_file_name = ???;
}
或者还有其他 C++11 方法可以实现这一点吗?它只需要在 Windows 上工作,因此特定于 Windows 的解决方案(带代码)就可以了。
我们希望在不添加对 boost 文件系统或 Qt 的依赖或迁移到 C++17 的情况下做到这一点。
更新 1
对于上下文,代码位于仅标头测试框架中,该框架旨在根据包含测试的源文件的名称创建一些输出文件 - 因此名为 DemoTest.cpp 的测试文件将生成一个输出文件,其名称以DemoTest... 开头。
我们试图解决的问题是,对于某些 Visual Studio 编译器设置,输出文件名以 demotest... 开头。
所以这意味着stat 调用在编译时生成__FILE__ 的同一源文件上运行。
更新 2
在 Visual Studio 2017 中调试时,statbuf.st_ino 的值为零 - 大概是因为该值表示 Unix inode,而在 Windows 上没有这样的东西。
所以这整个方法行不通。
还有其他选择吗?
【问题讨论】:
-
我会查看
GetLongPathName和GetFinalPathNameByHandle之类的内容(来自 msdn 上的随机搜索)。 -
还有
GetFullPathName。我不太确定这和GetLongPathName之间的区别。 -
谢谢,我应该说我知道这些,但很难找到它们与 C++11 一起使用的现代示例。