So löschen Sie eine Datei, nachdem Sie überprüft haben, ob sie vorhanden ist


220

Wie kann ich eine Datei in C # löschen, z. B. C:\test.txtdie gleiche Methode anwenden wie in Batch-Dateien, z

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Antworten:


388

Dies ist mit der File- Klasse ziemlich einfach .

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


Wie Chris in den Kommentaren betonte, müssen Sie die File.ExistsPrüfung File.Deletenicht durchführen, da keine Ausnahme ausgelöst wird, wenn die Datei nicht vorhanden ist. Wenn Sie jedoch absolute Pfade verwenden, müssen Sie die Prüfung durchführen, um sicherzustellen, dass die Der gesamte Dateipfad ist gültig.


13
Dieser Test wird eigentlich nicht benötigt. Siehe meinen Beitrag.
Chris Eberle

20
Der Test ist erforderlich, wenn Sie eine mögliche DirectoryNotFoundException verhindern möchten.
Timothy Strimple

7
Der Test sollte nicht anstelle der Ausnahmebehandlung verwendet werden, sondern in Verbindung damit. Eine beliebige Anzahl von Szenarien kann dazu führen, dass die vorhandene Prüfung true zurückgibt und das Löschen löscht.
Josh

1
Warum gibt es einen @vor dem Dateipfad? Bei mir geht es ohne.
Pascal Ackermann

5
@ verhindert, dass Sie die Backslashes verdoppeln müssen.
PRMan

105

Verwenden Sie System.IO.File.Delete wie folgt :

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

Aus der Dokumentation:

Wenn die zu löschende Datei nicht vorhanden ist, wird keine Ausnahme ausgelöst.


7
Dadurch wird eine DirectoryNotFoundException ausgelöst, wenn "Der angegebene Pfad ungültig ist (z. B. auf einem nicht zugeordneten Laufwerk)".
Timothy Strimple

5
Wie seltsam. Intellisense sagt An exception is thrown if the specified file does not exist.
Fearofawhackplanet

Vielleicht verwenden Sie eine andere Version des .NET Frameworks?
Chris Eberle

1
Ich benutze .Net4, es sieht so aus, als ob die Intellisense falsch ist. Ich habe eine Überprüfung durchgeführt und es wird keine Ausnahme ausgelöst
Angst vor Hackplanet

3
Ja, ich habe es versucht und ist einfach System.IO.File.Delete(@"C:\test.txt");genug. Vielen Dank
Berkay Turancı

33

Sie können den System.IONamespace importieren mit:

using System.IO;

Wenn der Dateipfad den vollständigen Pfad zur Datei darstellt, können Sie deren Existenz überprüfen und wie folgt löschen:

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

2
Warum nicht einfach den Aufruf Löschen trotzdem ausgeben und eine Ausnahme abfangen, die darauf hinweist, dass die Datei nicht vorhanden war?
antred

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

aber

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

wird das gleiche tun, solange der Ordner existiert.


23

Wenn Sie a vermeiden möchten, DirectoryNotFoundExceptionmüssen Sie sicherstellen, dass das Verzeichnis der Datei tatsächlich vorhanden ist. File.Existserreicht dies. Eine andere Möglichkeit wäre, die folgenden Pathund DirectoryUtility-Klassen zu verwenden:

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

Wenn Sie mit FileStream aus dieser Datei lesen und sie dann löschen möchten, müssen Sie den FileStream schließen, bevor Sie File.Delete (Pfad) aufrufen. Ich hatte dieses 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");

Oder verwenden Sie eine usingAnweisung, bei der File.Delete()die außerhalb der Klammern stehen würde. In dem Beispiel, das Sie haben, sollten Sie auch a filestream.Dispose();.
Vapcguy

1

Manchmal möchten Sie eine Datei in jedem Fall löschen (unabhängig von der Ausnahme löschen Sie die Datei bitte). Für solche Situationen.

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

Hinweis: Eine Ausnahme wird nicht ausgelöst, wenn die angegebene Datei nicht vorhanden ist.


10
Sie versuchen also, die Datei 20 Mal pro Sekunde zu löschen, bis sie gelöscht wird. Was ist, wenn die Datei aus irgendeinem Grund nicht gelöscht werden kann und das Programm versucht, sie für immer zu löschen? Ich denke nicht, dass dies eine gute Lösung ist.
kv1dr

2
Zumindest sollten Sie einen Timeout-Parameter angeben.
antred

@ kv1dr richtig. Ich denke, Sie sollten es für eine begrenzte Zeit versuchen und eine Fehlermeldung zurückgeben, wenn die Datei nicht gelöscht wurde.
QMaster

0

Dies wird der einfachste Weg sein,

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

Thread.sleep wird helfen, perfekt zu funktionieren, andernfalls wird es den nächsten Schritt beeinflussen, wenn wir die Datei kopieren oder schreiben.

Ein anderer Weg, den ich gemacht habe, ist:

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.