Каталог.Удалить (путь, true) удалить все файлы и подкаталоги, но вызвать исключение

#c# #file-io #io

#c# #file-io #io

Вопрос:

Я использую Directory.Метод удаления (путь, true) для удаления каталога. Перед удалением я использую этот метод, чтобы проверить, можно ли удалить папку:

 private bool FileCanDelete(string path)
    {
        try
        {
            //if this does not throw exception then the file is not use by another program
            using (FileStream fileStream = File.OpenWrite(path))
            {
                if (fileStream == null)
                    return false;
            }
            return true;
        }
        catch (UnauthorizedAccessException uaex)
        {
            throw uaex;
        }
        catch
        {
            return false;
        }
    }
  

Если возвращаемый результат равен true, вызовите метод delete. Я вижу, что все файлы и подкаталоги уже удалены, но метод выдает исключение: «Процесс не может получить доступ к файлу ‘xxxxxxx'».

Если не удалось удалить всю папку целиком, я хочу, чтобы операция удаления не удаляла ни одного файла в папке.

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

1. Я вижу, что функция вернет true, даже если вы только что создали экземпляр FileStream файла. Это локальная переменная и все такое, но я не уверен, что сборщик мусора освободит ее как раз вовремя для следующей операции (вызова delete). Вы пробовали освобождать его вручную, прежде чем возвращать true?

2. @Havenard Я предполагаю, что это не будет проблемой, поскольку using гарантирует удаление потока.

Ответ №1:

Попробуйте использовать файловый менеджер транзакций .NET

 TxFileManager fileMgr = new TxFileManager();
using (TransactionScope scope1 = new TransactionScope())
{

    fileMgr.DeleteDirectory(path);
    scope1.Complete();
}