FindFiles на букве диска не удается, но проходит по пути - PullRequest
0 голосов
/ 18 мая 2018

Я использую следующий код

#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 голосов
/ 18 мая 2018

Из документации FindFirstFile():

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

Параметры

lpFileName [in]

Каталог или путь,и имя файла.Имя файла может содержать символы подстановки, например, звездочку (*) или знак вопроса (?).

Этот параметр не должен быть NULL, недопустимой строкой (например, пустой строкой или строкой).в котором отсутствует завершающий нулевой символ), или оканчивается обратной косой чертой ().

(выделение мое)

Это означает, что вы просто не можетепередайте C:\ в качестве параметра и ожидайте, что он будет работать.

Тем не менее, вы не должны использовать FindFirstFile(), чтобы проверить, существует ли каталог.Это немного походит на дробовик 12 калибра, чтобы убить комара: это работает, но это излишне.

GetFileAttributes() - это функция, которую вы должны использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...