Як видалити файл, перевіривши, чи існує він


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
Тест необхідний, якщо ви хочете запобігти можливому каталогуNotFoundException.
Тимофій Стримп

7
Тест не слід використовувати замість обробки винятків із тхо, а скоріше в його проведенні. Будь-яка кількість сценаріїв може призвести до того, що існує чек, що повертає справжнє і кинути Видалити.
Джош

1
Чому там @ шлях до файлу? Для мене це працює без.
Паскаль Акерманн

5
@ утримує від необхідності подвоєння косого кута.
PRMan

105

Використовуйте System.IO.File.Delete так:

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

З документації:

Якщо файл, який потрібно видалити, не існує, виняток не викидається.


7
Це викине DirectoryNotFoundException, якщо "Вказаний шлях є недійсним (наприклад, він знаходиться на незмененому диску)."
Тимофій Стримп

5
Як дивно. Intellisense говорить An exception is thrown if the specified file does not exist.
fearofawhackplanet

Можливо, ви використовуєте іншу версію фреймворку .NET?
Кріс Еберл

1
Я використовую .Net4, це виглядає як IntelliSense неправильно мене запустити перевірку і винятку не кинуто
fearofawhackplanet

3
Так, я спробував і просто System.IO.File.Delete(@"C:\test.txt");достатньо. Спасибі
Беркай Туранчі

34

Ви можете імпортувати System.IOпростір імен за допомогою:

using System.IO;

Якщо filepath являє собою повний шлях до файлу, ви можете перевірити його існування та видалити так:

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  

2
Чому б просто не здійснити виклик «Видалити» незалежно від цього і вилучити будь-яке виключення, яке вказує на те, що файл не існував?
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

Якщо ви хочете уникнути, 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.