Я столкнулся с этой странной проблемой. Для удаления файла unlink() API вызывается в моем коде. Этот вызов удаляет файл и преуспеть на платформах, отличных от Windows. В окнах это удается (возвращает 0), но не удаляет файл.DeleteFile() или unlink() вызывает успешное выполнение, но не удаляет файл
Чтобы поэкспериментировать, я добавил цикл, чтобы повторно называть тот же API. На второй итерации я получил ошибку отказа от разрешения, код ошибки = 13. Хотя атрибуты чтения/записи задаются в файле, и программа имеет полное разрешение на доступ к файлу.
Я тогда позвонил DeleteFile() вместо unlink() API. К моему удивлению, я вижу тот же результат, вызов преуспел, то есть вернулся 1, но файл не удаляется физически.
Я проверил утилиту разблокировки, никакая другая программа не обращается к файлу, кроме программы, которая пытается удалить этот файл.
Есть ли у кого-нибудь идеи, что еще может быть неправильно?
Редактировать 1: Просто чтобы файл не был открыт во время его удаления. Я сохранил дескриптор, когда был создан файл, и попытался закрыть его перед удалением, но я получил ошибку «UNOPENED» (Errcode: 9 - Bad file descriptor) ». Таким образом, я делаю вывод, что файл не был открыт во время его удаления.
Редакция 2 В соответствии с просьбой, приведена упрощенная версия кода, используемого для создания и удаления файла.
// Code to create the file
int create_file(const char* path)
{
HANDLE osfh; /* OS handle of opened file */
DWORD fileaccess; /* OS file access (requested) */
DWORD fileshare; /* OS file sharing mode */
DWORD filecreate; /* OS method of opening/creating */
DWORD fileattrib; /* OS file attribute flags */
SECURITY_ATTRIBUTES SecurityAttributes;
SecurityAttributes.nLength= sizeof(SecurityAttributes);
SecurityAttributes.lpSecurityDescriptor= NULL;
SecurityAttributes.bInheritHandle= !(oflag & _O_NOINHERIT);
fileaccess= GENERIC_WRITE;
fileshare= FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
filecreate= CREATE_NEW;
if ((osfh= CreateFile(path, fileaccess, fileshare, &SecurityAttributes,
filecreate, fileattrib, NULL)) == INVALID_HANDLE_VALUE)
{
// error handling
}
}
//Code to delete the file -
int remove_file (const char* name)
{
if ((err = unlink(name)) == -1)
{ //Error handling }
}
Edit3 Как указано на Joachim Pileborg и icabod, что DeleteFile()
не удаляет файл, если он все еще открыт. Как было предложено Remy Lebeau, чтобы использовать проводник процесса. Я обнаружил, что один дескриптор файла был действительно открыт, когда я закрыл его из файла explorer процесса, удаленного как шарм :)
Я также упомянул в документе Edit1, когда пытался закрыть файл. Я получил ошибку. Это произошло потому, что дескриптор файла, который я получаю от createfile()
, не является фактическим дескриптором, возвращаемым API CreateFile(), а не логическим отображаемым дескриптором из-за сложности кода, поддерживающего другие не-windows-платформы. В любом случае, теперь я понял основную причину проблемы, но я ожидал, если файл с открытым дескриптором будет передан в DeleteFile()
API, тогда он должен потерпеть неудачу в первой попытке, а не преуспеть и дождаться закрытия открытых дескрипторов.
Вы говорите: «никакая другая программа не выполняет доступ к файлу, кроме программы, которая пытается удалить этот файл». Означает ли это, что файл открыт в вашей программе (например, 'open',' fopen' или 'CreateFile')? Тогда нет, он не будет удален с диска, так как ваша программа все еще открыта. Если вы сначала закроете файл и * затем * удалите его, он должен работать. –
Я нахожу это странным, если люди считают, что вопрос не стоит спрашивать, что вместе с голосом. Что случилось с вопросом? – Rahul
@JoachimPileborg, если файл все еще открыт, не должен 'DeleteFile' возвращать false? –