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)
Tom
quelle

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.

Adam Lear
quelle
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.

Chris Eberle
quelle
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
    } 
}  
Mischel Vettukattil
quelle
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.

Vercas
quelle
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);
}
Derek W.
quelle
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;
        }
    }
Ahmed Ghazey
quelle
11
if (File.Exists(path))
{
    File.Delete(path);
}
ecMode
quelle
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");
ag93
quelle
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.

Hameed Syed
quelle
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);
}
Aniyan Kolathur
quelle