Почему код не может найти файл?

135
28 ноября 2019, 13:40

GetLastError возвращает ERROR_FILE_NOT_FOUND, хотя в папке есть файлы попадающие под маску. В чем проблема? Буду благодарен за помощь!

#include <windows.h>
#include <stdio.h>
LPWSTR fileName = L"*.exe";
LPWIN32_FIND_DATAW data32;
HANDLE fileHandle;
int main(){
    fileHandle = FindFirstFileW(fileName, data32);
    printf("%08x\n", GetLastError());
    if(fileHandle != 0){
        while(FindNextFileW(fileHandle, data32)){
            MessageBoxW(0, data32->cFileName, L"File Found!", 0);
        }
    }
    FindClose(fileHandle);
    system("pause");
    return 0;
}
Answer 1

Ошибки у вас такие:

1) Используете указатель на структуру WIN32_FIND_DATAW, но ее не создаете. Поэтому в FindFirstFileW передается мусор.

2) Ищете *.exe там, где их нет. Программа запускается в каталоге проекта, а не в каталоге Debug. Понятно, что поиск исполняемых файлов ничего не вернет. Путь всегда надо задавать явно.

3) Ну и мелочевка вроде присваивания LPWSTR fileName = L"*.exe"; (адрес константы неконстантному указателю).

Вот исправленный вариант (ищет *.* чтобы понятнее было):

int main() {
  LPCWSTR fileName = L"*.*";
  WIN32_FIND_DATAW data32;
  HANDLE fileHandle;
  fileHandle = FindFirstFileW(fileName, &data32);
  if(fileHandle != NULL) {
    while(FindNextFileW(fileHandle, &data32)){
      MessageBoxW(0, data32.cFileName, L"File Found!", 0);
    }
    FindClose(fileHandle);
  }
  else
    printf("%08x\n", GetLastError());
  system("pause");
  return 0;
}
Answer 2

Не скажу, что все проблемы в этом, но...

Читаем в описании:

BOOL FindNextFileW(
  HANDLE             hFindFile,
  LPWIN32_FIND_DATAW lpFindFileData
);

lpFindFileData
A pointer to the WIN32_FIND_DATA structure that receives information about the found file or subdirectory.

Как минимум - где ваша структура?

Подготовьте ее и передайте адрес:

WIN32_FIND_DATA ffd;
...
FindFirstFileW(fileName, &ffd);

Еще - если файл единственный, он будет найден FindFirstFile (и информация о нем не выведена), а FindNextFile находить будет уже нечего.

Еще - зачем вам в консольном приложении MessageBox?

Опять же - если это C++, то почему бы не воспользоваться <filesystem>?

READ ALSO
Обработка символов

Обработка символов

Написал программу для нахождения в строке( массиве символов ) слова наименьшей длины, и замены этого слова на символ '*'Программа работает,...

136
QThreadPool pure virtual method called

QThreadPool pure virtual method called

В конструкторе окна создаю объект Runnable:

127
Как узнать, имеет ли класс определенного родителя?

Как узнать, имеет ли класс определенного родителя?

Как узнать, имеет ли класс определенного родителя?

101
Как запретить пользователю вводить в QLineEdit что-либо кроме URL?

Как запретить пользователю вводить в QLineEdit что-либо кроме URL?

Как запретить пользователю вводить в QLineEdit что-либо кроме URL?

126