У нас есть сервер на Windows, но у него есть сетевой диск, который на самом деле находится на сервере Linux. Программа должна удалить файл в том же месте с тем же именем (сигналы), она работает нормально, когда эти файлы находятся на локальном диске, но при работе на сетевом диске, когда-нибудь не удалит файл, и даже хуже, функции вернут, что все прошло нормально (то есть файл удален). Я пробовал с remove
, _unlink
, DeleteFileA
проблема по-прежнему сохраняется, иногда совершенно случайно она не будет удалена и останется такой.
Код действительно прост:
bool File::Delete()
{
if(isFile() && exist())
{
return DeleteFileA(filename.c_str()) != 0 ? true : false;
}
else
return false;
}
Это всегда будет возвращать true, даже если файл не будет удален, если, например, у него не будет разрешения, он должен потерпеть неудачу (и выходить из строя каждый раз, а не случайно), может кто-нибудь дать мне идею? У меня кончились варианты 🙁
Редактировать:
Благодаря @ExcessPhase кажется, что moveFile фактически обнаруживает ошибку, поэтому переименование перед удалением может обнаружить проблему «ERROR_FILE_NOT_FOUND».
Другие вещи: Эта случайная проблема может возникнуть только тогда, когда файлы создаются на сервере Linux. Если я создам их из окон, они всегда будут удалены. Более того: если у меня есть файл, который программа не может удалить, и я создаю другой файл рядом с ним из Windows, программа обнаружит и удалит тот файл, который не мог удалить ранее.
Edit2: Ближе к ответу: имя файла test
а также TEST
в Linux все по-другому, а в Windows то же самое. Проблема кажется случайной, когда случай не совпадает. Но я не уверен, так как это так случайно.
Я считаю, что проблема заключается в службе Samba в Linux, которая реализует протокол SMB для Windows. DeleteFile
функция просто запрашивает сервер SMB (сервер служба Windows) для удаления файла. Успех возвращается Самба.
Возможно, вам стоит попробовать что-то более высокого уровня, например, повысить файловую систему, или станд :: экспериментальная :: файловая система :: удалить