驱动器号上的FindFiles失败但传递路径

时间:2018-05-18 19:14:50

标签: c++ windows api winapi

我正在使用以下代码

#include "stdafx.h"
#include <iostream>
#include "stdafx.h"
#include <windows.h>
#include <string>
#include <commdlg.h>
#include <Shlwapi.h>
#pragma comment (lib, "Shlwapi.lib")

// This function is an abomination -- I just wrote it to be quick.
std::wstring CombinePaths(std::wstring const &pattern, LPCWSTR filename) {
    std::wstring tmp(pattern);
    tmp.push_back('\0');
    PathRemoveFileSpec(&tmp[0]);
    std::wstring retVal(MAX_PATH, '\0');
    PathCombine(&retVal[0], tmp.c_str(), filename);
    return retVal.c_str();
}

void FindFiles(std::wstring const &pattern) {
    WIN32_FIND_DATA fd;
    HANDLE h = FindFirstFile(pattern.c_str(), &fd);
    if (h == INVALID_HANDLE_VALUE) {
        wprintf(L"FindFirstFile.  Err=%d\n", GetLastError());
        return;
    }

    do {
        std::wstring fullPath = CombinePaths(pattern, fd.cFileName);
        wprintf(L"FullPath=%s\n", fullPath.c_str());
    } while (FindNextFile(h, &fd));

    FindClose(h);
}

int main()
{
    FindFiles(L"c:\\Windows"); //Passes
    FindFiles(L"c:\\"); //Fails
    std::cin.get();
    return 0;
}

为什么不传递C:\\?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

来自FindFirstFile()文档:

HANDLE WINAPI FindFirstFile(
  _In_  LPCTSTR           lpFileName,
  _Out_ LPWIN32_FIND_DATA lpFindFileData
);
     

参数

     

lpFileName [in]

     

目录或路径以及文件名。文件名可以包含通配符,例如星号(*)或问号(?)。

     

此参数不应为NULL,无效字符串(例如,空字符串或缺少终止空字符的字符串),或以尾部反斜杠()结尾。

(强调我的)

这意味着您无法通过C:\作为参数并期望它能够正常工作。

也就是说,您不应该使用FindFirstFile()来检查目录是否存在。这有点像用12号霰弹枪杀死一只蚊子:它有效,但它有点矫枉过正。

GetFileAttributes()是您应该使用的功能。