Looking for .net Keywords? Try Ask4Keywords

.NET Framework Удалить файл


пример

Чтобы удалить файл (если у вас есть необходимые разрешения), просто:

File.Delete(path);

Однако многие вещи могут пойти не так:

  • У вас нет необходимых разрешений (вызывается UnauthorizedAccessException ).
  • Файл может быть использован кем-то другим (вызывается IOException ).
  • Файл не может быть удален из-за ошибки низкого уровня или носитель доступен только для чтения ( IOException ).
  • Файл больше не существует (вызывается IOException ).

Обратите внимание, что последняя точка (файл не существует) обычно обходит фрагмент кода следующим образом:

if (File.Exists(path))
    File.Delete(path);

Однако это не атомная операция, и файл может быть File.Exists() кем-то другим между вызовом File.Exists() и перед File.Delete() . Правильный подход к обработке операций ввода-вывода требует обработки исключений (при условии, что при выполнении операции может быть предпринят альтернативный курс действий):

if (File.Exists(path))
{
    try
    {
        File.Delete(path);
    }
    catch (IOException exception)
    {
        if (!File.Exists(path))
            return; // Someone else deleted this file

        // Something went wrong...
    }
    catch (UnauthorizedAccessException exception)
    {
        // I do not have required permissions
    }
}

Обратите внимание, что эти ошибки ввода-вывода иногда являются временными (например, файл используется), и если задействовано сетевое подключение, оно может автоматически восстанавливаться без каких-либо действий с нашей стороны. Затем обычно повторяется операция ввода-вывода несколько раз с небольшой задержкой между каждой попыткой:

public static void Delete(string path)
{
    if (!File.Exists(path))
        return;

    for (int i=1; ; ++i)
    {
        try
        {
            File.Delete(path);
            return;
        }
        catch (IOException e)
        {
            if (!File.Exists(path))
                return;

            if (i == NumberOfAttempts)
                throw;

            Thread.Sleep(DelayBetweenEachAttempt);
        }

        // You may handle UnauthorizedAccessException but this issue
        // will probably won't be fixed in few seconds...
    }
}

private const int NumberOfAttempts = 3;
private const int DelayBetweenEachAttempt = 1000; // ms

Примечание: в среде Windows файл не будет действительно удален при вызове этой функции, если кто-то еще откроет файл с помощью FileShare.Delete тогда файл можно удалить, но это будет эффективно, только когда владелец закроет файл.