Как удалить файл после проверки, существует ли он

220

Как я могу удалить файл в C #, например C:\test.txt, хотя применять такой же метод, как в пакетных файлах, например,

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)
Том
источник

Ответы:

388

Это довольно просто, используя класс File .

if(File.Exists(@"C:\test.txt"))
{
    File.Delete(@"C:\test.txt");
}


Как отметил Крис в комментариях, вам на самом деле не нужно выполнять File.Existsпроверку, поскольку File.Deleteне выдает исключение, если файл не существует, хотя, если вы используете абсолютные пути, вам понадобится проверка, чтобы убедиться, что весь путь к файлу действителен.

Адам Лир
источник
13
Этот тест на самом деле не нужен. Смотрите мой пост.
Крис Эберле
20
Тест необходим, если вы хотите предотвратить возможное исключение DirectoryNotFoundException.
Тимоти Стриппл
7
Тест не должен использоваться вместо обработки исключений, а скорее в связи с ним. Любое количество сценариев может привести к проверке существующего, возвращающей значение true и исключение.
Джош
1
Почему есть @путь до файла? Для меня это работает без.
Паскаль Аккерманн
5
@ не дает вам удвоить обратную косую черту.
PRMan
105

Используйте System.IO.File.Delete следующим образом:

System.IO.File.Delete(@"C:\test.txt")

Из документации:

Если удаляемый файл не существует, исключение не выдается.

Крис Эберле
источник
7
Это вызовет исключение DirectoryNotFoundException, если «указанный путь недопустим (например, он находится на неподписанном диске)».
Тимоти Стриппл
5
Как странно. Интеллисенс говорит An exception is thrown if the specified file does not exist.
fearofawhackplanet
Возможно, вы используете другую версию .NET Framework?
Крис Эберле
1
Я использую .Net4, похоже, что intellisense не так, я выполнил проверку, и никакое исключение не
выдается
3
Да, я пытался, и этого System.IO.File.Delete(@"C:\test.txt");достаточно. Спасибо
Berkay Turancı
34

Вы можете импортировать System.IOпространство имен, используя:

using System.IO;

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

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  
mishel vettukattil
источник
2
Почему бы просто не выполнить вызов Delete независимо и перехватить любое исключение, которое указывает, что файл не существует?
antred
32
if (System.IO.File.Exists(@"C:\test.txt"))
    System.IO.File.Delete(@"C:\test.txt"));

но

System.IO.File.Delete(@"C:\test.txt");

будет делать то же самое, пока существует папка.

Vercas
источник
23

Если вы хотите избежать a, DirectoryNotFoundExceptionвам нужно убедиться, что каталог файла действительно существует. File.Existsвыполняет это. Другим способом было бы использовать Pathи Directoryвспомогательные классы , как так:

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))
{
    File.Delete(file);
}
Дерек W
источник
15
  if (System.IO.File.Exists(@"C:\Users\Public\DeleteTest\test.txt"))
    {
        // Use a try block to catch IOExceptions, to 
        // handle the case of the file already being 
        // opened by another process. 
        try
        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine(e.Message);
            return;
        }
    }
Ахмед Гази
источник
1

Если вы читаете из этого файла, используя FileStream, а затем хотите удалить его, убедитесь, что вы закрыли FileStream, прежде чем вызывать File.Delete (путь). У меня была эта проблема.

var filestream = new System.IO.FileStream(@"C:\Test\PutInv.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
filestream.Close();
File.Delete(@"C:\Test\PutInv.txt");
AG93
источник
Или используйте usingутверждение, где File.Delete()бы выйти за скобки. В примере, который вы имеете, вы также должны сделать filestream.Dispose();.
vapcguy
1

Иногда вы хотите удалить файл в любом случае (независимо от исключения, пожалуйста, удалите файл). Для таких ситуаций.

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

            bool isDeleted = false;
            while (!isDeleted)
            {
                try
                {
                    File.Delete(path);
                    isDeleted = true;
                }
                catch (Exception e)
                {
                }
                Thread.Sleep(50);
            }
        }

Примечание. Исключение не выдается, если указанный файл не существует.

Хамид Сайед
источник
10
Таким образом, вы пытаетесь удалить файл 20 раз в секунду, пока он не будет удален. Что если по какой-то причине файл не может быть удален, и программа будет пытаться удалить его навсегда? Я не думаю, что это хорошее решение.
kv1dr
2
По крайней мере, вы должны предоставить параметр времени ожидания.
antred
@ kv1dr верно. Я думаю, что вы должны попытаться в течение ограниченного времени и вернуть сообщение об ошибке, если файл не был удален.
QMaster
0

Это будет самый простой способ,

if (System.IO.File.Exists(filePath)) 
{
  System.IO.File.Delete(filePath);
  System.Threading.Thread.Sleep(20);
}

Thread.sleep поможет отлично работать, иначе это повлияет на следующий шаг, если мы будем копировать или записывать файл.

Я так и сделал,

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Аниян Колатур
источник