2012-04-25 3 views
0

Я не должен удалять файл с открытым дескриптором, правильно? Поэтому я создаю файл, а затем сразу же пытаюсь его удалить, ожидая, что это сработает. Или я ошибаюсь, и дескриптор не должен быть закрыт перед удалением файла?Удаление файла с открытой ручкой

HANDLE hFile = CreateFile (TEXT(file),  
        GENERIC_WRITE,   
        0,      
        NULL,     
        OPEN_ALWAYS,   
        FILE_ATTRIBUTE_NORMAL, 
        NULL);     

if (hFile == INVALID_HANDLE_VALUE) 
{ 
    //FAIL 
} 

if(DeleteFile(file)) 
{ 
    //Should it ever get here cos i dont close the handle? 
} 
+2

Является ли этот вопрос конкретной ОС/библиотекой? Затем пометьте соответственно. – iammilind

+0

Предположительно, Windows? –

+0

согласно документам, ручка может быть открыта, также останется доступной для записи, до закрытия. Я считаю, что это относится ко всем системам на основе posix. –

ответ

0

Да, это провалится.

Функция DeleteFile терпит неудачу, если приложение пытается удалить файл, который открыт для обычного ввода/вывода или в качестве отображаемой памяти файла.

0

Вы пробовали это? В документации MS указывается, что:

Функция DeleteFile не работает, если приложение пытается удалить файл, открытый для нормального ввода-вывода или в виде файла с отображением памяти.

Так что если вы не получите такое поведение, я бы посоветовал, что это не так, как вы открыли файл. Вы уверены, что ваш чек о том, открыт ли файл, полностью исчерпан? Вы сначала попытались записать файл? Вы можете видеть файл за пределами своего собственного кода? (т. е. от проводника) Посмотрите here для более подробной информации.

2

Это зависит от того, как файл был открыт. Если в режиме общего доступа указан FILE_SHARE_DELETE, он может быть удален другими.

Даже если вы сохранили карту памяти, и она была открыта с помощью этого флага (и совместного использования для чтения/записи), он все равно может быть удален оболочкой (по крайней мере, я пробовал это, и это происходит, но возможно, файл просто переименован и перемещен в корзину). В таких случаях последующий доступ к памяти приведет к исключению C-стиля InPageError.

Смежные вопросы