#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 в начале и используя его оттуда …). Убедитесь, что вы не пытаетесь выполнить запись / чтение из привилегированного места на диске. Проверьте свои пути.