Создание файла в отдельном потоке возвращает значение INVALID_HANDLE_VALUE в приложении MFC

#multithreading #winapi #mfc #createfile

#многопоточность #winapi #mfc #создание файла

Вопрос:

У меня есть приложение MFC, которое запускает отдельный поток для загрузки некоторых файлов через cURL. При запуске он загружает текстовый файл с размерами файла и временем последней записи. Затем он проверяет файлы на диске и ставит их в очередь для загрузки, если они имеют разные значения.. Проблема в том, что вызов CreateFile в потоке произвольно возвращает INVALID_HANDLE_VALUE . Я всегда делаю CloseHandle() после успешного CreateFile() . Неудачные файлы просто случайны. Иногда файл в корневом каталоге, в другой раз файл во вложенном каталоге. Проблема не связана с локализацией или именами каталогов / файлов, поскольку иногда все проверки проходят, но иногда нет. GetLastError() иногда возвращает 2 или 3, которые являются «Файл не найден» / «Путь не найден» соответственно.

Когда я помещаю функцию, проверяющую время записи и размер файла, прямо в функцию OnInitDialog(), все работает. Это пахнет как проблема с многопоточностью, но я дважды проверил все, от выделения памяти до дескрипторов файлов.

Тот же код работает в консольном приложении также в отдельном потоке.

Платформа Win7 64bit.
Статическое связывание с средой выполнения и MFC.

Комментарии:

1. Вы используете абсолютные или относительные пути? Возможно, другой поток изменяет текущий каталог, в результате чего ваши относительные пути становятся недействительными.

2. Я не могу отблагодарить вас достаточно … 🙂 Сделайте это ответом, чтобы я мог это сделать.

3. Продолжайте и отправьте свой собственный ответ и примите его.

Ответ №1:

в моем случае GetCurrentDirectory() через некоторое время вернул путь system32, поэтому мой код не удался из-за учетных данных. Я исправил проблему, определив пути к файлам вручную (получая путь exe в начале и используя его оттуда …). Убедитесь, что вы не пытаетесь выполнить запись / чтение из привилегированного места на диске. Проверьте свои пути.