неверный дескриптор поиска при итерации каталога в Windows - PullRequest
0 голосов
/ 27 апреля 2019

Я получаю сообщение об ошибке неверного файла при итерации по локальному каталогу (согласно проверке на месте), однако я не могу точно определить, что именно вызывает это.Есть ли что-нибудь поразительно очевидное, что может быть причиной этого?

#define MAX_PATHNAME_LEN 260

int main(int argc, char* argv[])
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;
    DWORD dwError;
    char DirSpec[MAX_PATHNAME_LEN];

    argv[0] = "\N:\\Joe\\My Documents\\";
    snprintf(DirSpec, "%s\\*", argv[0]);

    // Find the first file in the directory.
    hFind = FindFirstFile(DirSpec, &FindFileData);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        printf("Invalid file handle. Error is %u.\n", GetLastError());
        return (-1);
    }
    else
    {
        printf("First file name is %s.\n", FindFileData.cFileName);  
            // List all the other files in the directory.
            while (FindNextFile(hFind, &FindFileData) != 0)
            {
                printf("Next file name is %s.\n", FindFileData.cFileName); 
            }

        dwError = GetLastError();
        FindClose(hFind);
        if (dwError != ERROR_NO_MORE_FILES)
        {
            printf("FindNextFile error. Error is %u.\n", dwError);
            return (-1);
        }
    }

    return (0);
}

Каталог правильный, однако он не сканируется в папке правильно.Я использую Visual Studio 2019 для записи / компиляции этого.

1 Ответ

0 голосов
/ 27 апреля 2019

Во-первых, вам не нужно определять

#define MAX_PATHNAME_LEN 260

Windows уже определяет

#define MAX_PATH 260

Во-вторых, если выдобавляется диск N:, потому что это общий сетевой ресурс, он должен быть \\\\N:\\, чтобы экранированная строка была \\N:\.

В-третьих, вы действительно должны не бытьзапись в argv[].Стандарт C не предусматривает абсолютно никакой возможности его записи, и у вас нет возможности узнать, записываете ли вы конец буфера.Используйте это вместо этого:

char basePath[] = "\\\\N:\\Joe\\My Documents\\";

Ваш вызов snprintf(DirSpec, "%s\\*", argv[0]); не включает длину буфера назначения, так что это вопрос, как это будет работать.Попробуйте

snprintf(DirSpec, MAX_PATH, "%s*", basePath);

Обратите внимание, что обратные косые черты были удалены из строки формата, поскольку подстановочный знак для содержимого каталога для функции FindFirstFile() равен DirPath\*, а базовый путь уже заканчивается обратной косой чертой.

...