WIN32_FIND_DATA - 获取绝对路径

8
我正在使用类似于这样的东西:
std::string tempDirectory = "./test/*";

WIN32_FIND_DATA directoryHandle;
memset(&directoryHandle, 0, sizeof(WIN32_FIND_DATA));//perhaps redundant???

std::wstring wideString = std::wstring(tempDirectory.begin(), tempDirectory.end());
LPCWSTR directoryPath = wideString.c_str();

//iterate over all files
HANDLE handle = FindFirstFile(directoryPath, &directoryHandle);
while(INVALID_HANDLE_VALUE != handle)
{
    //skip non-files
    if (!(directoryHandle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
    {
        //convert from WCHAR to std::string
        size_t size = wcslen(directoryHandle.cFileName);
        char * buffer = new char [2 * size + 2];
        wcstombs(buffer, directoryHandle.cFileName, 2 * size + 2);
        std::string file(buffer);
        delete [] buffer;

        std::cout << file;
    }

    if(FALSE == FindNextFile(handle, &directoryHandle)) break;
}

//close the handle
FindClose(handle);

这段代码会打印出相对目录 ./test/* 中每个文件的名称。

有没有办法确定该目录的绝对路径,就像 Linux 上的 realpath() 一样,而不涉及任何第三方库,比如 BOOST?我想打印每个文件的绝对路径。


我认为我不需要这样的通用解决方案。就目前而言,本地路径应该足够了(例如C:\bla\blabla\etc)。 - Mihai Todor
1
同意,但在我的情况下,应用程序将始终从本地驱动器运行。因此,在这种特殊情况下,我想问的是,是否有一个API函数可以返回可用的绝对路径? - Mihai Todor
关于您对缓冲区的评论,wcstombs函数是否能与std::vector<char>良好兼容? - Mihai Todor
1
std::vector<char> 简单来说就是一个动态分配的 char 数组,所以如果你使用 .resize() 将其大小调整到所需大小,那么你可以调用 .data() 来获取指向其初始元素的指针。对于 wcstombs 函数而言,这个指针和通过 new 分配数组得到的指针没有任何区别。 - James McNellis
1
提示:您可以使用 WIN32_FIND_DATA directoryHandle = { 0 }; 来消除 memset。在 C 和 C++ 中都有效。 - MSalters
显示剩余4条评论
2个回答

10

5
具体而言,对目录调用GetFullPathName函数,并将其与WIN32_FIND_DATA中的文件名结合起来。 - Raymond Chen
@RaymondChen,那该怎么做呢?在我的情况下(类似于问题),我有一个带通配符的路径字符串,但我只有找到的文件句柄。由于路径可能包含通配符,因此目录可能不存在,所以我需要获取找到的文件的父目录,然后获取该目录的完整路径? - Javier Mr
1
@JavierMr 如果您有新的问题,请发布一个新的问题。我不知道您所说的“目录可能不存在”的意思。该目录就在那里:在./test/*中,该目录是./test。通配符不能用于目录部分,因此获取目录不需要处理通配符。 - Raymond Chen
@RaymondChen,实际上完成问题中的代码以打印绝对路径就足够了。我不知道通配符只允许在路径的目录部分使用,这确实使事情变得更容易了。 - Javier Mr

4
您可以尝试使用GetFullPathName函数。
或者您可以使用SetCurrentDirectoryGetCurrentDirectory函数。在执行此操作之前,您可能需要保存当前目录,以便以后可以返回到它。
在这两种情况下,您只需要获取搜索目录的完整路径。API调用速度较慢。在循环内,您只需组合字符串即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接