Jak usunąć plik po sprawdzeniu, czy istnieje


220

Jak mogę usunąć plik w C # np. C:\test.txt, Chociaż stosuję taką samą metodę jak w plikach wsadowych np

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Odpowiedzi:


388

Jest to dość proste przy użyciu klasy File .

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


Jak zauważył Chris w komentarzach, tak naprawdę nie musisz File.Existssprawdzać, ponieważ File.Deletenie zgłasza wyjątku, jeśli plik nie istnieje, chociaż jeśli używasz ścieżek bezwzględnych, musisz sprawdzić, czy cała ścieżka do pliku jest poprawna.


13
Ten test nie jest tak naprawdę potrzebny. Zobacz mój post.
Chris Eberle

20
Test jest konieczny, jeśli chcesz zapobiec możliwemu wyjątkowi DirectoryNotFoundException.
Timothy Strimple 17.06.11

7
Test nie powinien być stosowany zamiast obsługi wyjątków, ale raczej z nim przeprowadzany. Dowolna liczba scenariuszy może spowodować, że istniejący czek zwróci wartość true i usunie wyrzucanie.
Josh

1
Dlaczego istnieje @przed ścieżką do pliku? Dla mnie to działa bez.
Pascal Ackermann,

5
@ chroni Cię przed podwojeniem odwrotnych ukośników.
PRMan

105

Użyj System.IO.File.Delete w następujący sposób:

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

Z dokumentacji:

Jeśli plik do usunięcia nie istnieje, wyjątek nie jest zgłaszany.


7
Spowoduje to zgłoszenie wyjątku DirectoryNotFoundException, jeśli „Podana ścieżka jest niepoprawna (na przykład znajduje się na niezamapowanym dysku)”.
Timothy Strimple 17.06.11

5
Jakie dziwne Intellisense mówi An exception is thrown if the specified file does not exist.
Strachofawhackplanet

Być może używasz innej wersji środowiska .NET?
Chris Eberle

1
Używam .Net4, wygląda na to, że inteligencja jest nieprawidłowa. Przeprowadziłem kontrolę i nie
zgłoszono

3
Tak, próbowałem i System.IO.File.Delete(@"C:\test.txt");wystarczy. Dzięki
Berkay Turancı,

34

Możesz zaimportować System.IOprzestrzeń nazw używając:

using System.IO;

Jeśli ścieżka do pliku reprezentuje pełną ścieżkę do pliku, możesz sprawdzić jego istnienie i usunąć go w następujący sposób:

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

2
Dlaczego po prostu nie wywołać wywołania Usuń niezależnie i złapać wyjątek wskazujący, że plik nie istniał?
antred

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

ale

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

zrobi to samo, o ile folder istnieje.


23

Jeśli chcesz tego uniknąć DirectoryNotFoundException, musisz upewnić się, że katalog pliku rzeczywiście istnieje. File.Existsosiąga to. Innym sposobem byłoby wykorzystanie klas użyteczności Pathi Directorytakich jak:

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

Jeśli czytasz z tego pliku za pomocą FileStream, a następnie chcesz go usunąć, pamiętaj, aby zamknąć FileStream przed wywołaniem File.Delete (ścieżka). Miałem ten problem.

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

Lub użyj usinginstrukcji, w której File.Delete()wychodziłby poza nawiasy. W tym przykładzie powinieneś również zrobić filestream.Dispose();.
vapcguy

1

Czasami chcesz usunąć plik niezależnie od przypadku (bez względu na wyjątek, usuń plik). W takich sytuacjach.

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

Uwaga: wyjątek nie jest zgłaszany, jeśli określony plik nie istnieje.


10
Więc próbujesz usunąć plik 20 razy na sekundę, aż zostanie usunięty. Co jeśli, z jakiegoś powodu, plik nie może zostać usunięty, a program będzie próbował go usunąć na zawsze? Nie sądzę, że to dobre rozwiązanie.
kv1dr

2
Przynajmniej powinieneś podać parametr limitu czasu.
antred

@ kv1dr w prawo. Myślę, że powinieneś spróbować przez ograniczony czas i zwrócić komunikat o błędzie, jeśli plik nie został usunięty.
QMaster

0

To będzie najprostszy sposób,

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

Thread.sleep pomoże doskonale działać, w przeciwnym razie wpłynie to na następny krok, jeśli wykonamy kopiowanie lub zapisywanie pliku.

Innym sposobem, w jaki to zrobiłem, jest

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.