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


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
    } 
}  

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");

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


23

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

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))
{
    File.Delete(file);
}

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");

Или используйте 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);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.