2017-07-13 2 views
-2

Ich versuche, einige Dateien in einem Verzeichnis aus einem separaten Thread zu löschen, aber manchmal funktioniert das Löschen nicht.C# File.Delete funktioniert nicht

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory()); 
FileInfo[] fileNames = dirInfo.GetFiles("*.*"); 
foreach (FileInfo fileName in fileNames) 
{ 
    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name; 
    if (File.Exists(destinationFilename)) 
     File.Delete(destinationFilename); 

    File.Move(fileName.FullName, destinationFilename); 
} 

Mein Ziel ist es, einige Dateien in einem Verzeichnis zu bewegen, aber, wie ich weiß, dass die File.Move funktioniert nicht, wenn die Zieldatei bereits vorhanden ist. Also, ich überprüfe, ob die Datei existiert und wenn es wahr ist, lösche ich diese Datei und gehe dann zum Original.

Die File.Delete verursachen auch ein vorzeitiges Verlassen der Funktion. Das aktuelle Verzeichnis ist nicht derselbe Ordner, in dem die ausführbare Datei ausgeführt wird, da ich sie zuvor in einem anderen Ordner eingerichtet habe.

Wie kann ich diesen Fehler vermeiden? Und verschiebe die Dateien immer noch in das Zielverzeichnis?

+0

"vorzeitig beenden?" Was bedeutet das? Erhalten Sie eine Ausnahme? – DavidG

+1

Ich sehe keine Frage ... – fredrik

+0

Sie müssen entscheiden, wie Sie mit Fehlerfällen umgehen, die Sie in Ihrer Frage vorschlagen. Es ist durchaus möglich, dass zwischen dem Überprüfen der Datei und dem anschließenden Löschen die Datei von einem anderen Prozess geöffnet wurde. Sie können eine Ausnahme um das File.Delete herum abfangen und dann die Ursprungsdatei nicht verschieben, wenn sie ausgelöst wird, aber Sie werden mit Dateien enden, die nicht verschoben wurden. Du kannst nichts dagegen tun. – Neil

Antwort

0

Das Problem dort ist, dass der Zugriff auf die Datei wegen des schreibgeschützten Attributs der Datei verweigert wird.

Also, habe ich alle meine Dateien Attribute so normal wie die folgen:

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory()); 
FileInfo[] fileNames = dirInfo.GetFiles("*.*"); 
foreach (FileInfo fileName in fileNames) 
{ 
    if (fileName.Extension == ".iso") 
     return; 

    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name; 
    fileName.Attributes = FileAttributes.Normal; 
    if (File.Exists(destinationFilename)) 
    { 
     File.SetAttributes(destinationFilename, FileAttributes.Normal); 
     File.Delete(destinationFilename); 
    } 

    File.Move(fileName.FullName, destinationFilename); 
} 
+0

Wie lösen Sie dieses Problem? Erkennen Sie, dass es sich bei der Datei um R/O handelt, und legen Sie die Attribute entsprechend fest oder überspringen Sie sie oder was? – Neil

+0

Ich setze alle Dateiattribute als Normal mit 'File.SetAttributes (destinationFilename, FileAttributes.Normal);' Da diese Dateien keine speziellen Attribute haben müssen. – KingOfMazes

1

Sie müssen entscheiden, wie Sie mit Fehlerfällen umgehen, die Sie in Ihrer Frage vorschlagen. Es ist durchaus möglich, dass zwischen dem Überprüfen der Datei und dem anschließenden Löschen die Datei von einem anderen Prozess geöffnet wurde. Sie können eine Ausnahme um das File.Delete herum abfangen und dann die Ursprungsdatei nicht verschieben, wenn sie ausgelöst wird, aber Sie werden mit Dateien enden, die nicht verschoben wurden. Du kannst nichts dagegen tun.

+0

Ich habe die try-catch-Anweisung implementiert, aber es gibt keine Ausnahmen – KingOfMazes

+0

Anstelle von IOException habe ich die Ausnahme verwendet. Es ruft einen Zugriff verweigert ab. Aber es gibt keine Antiviren- oder andere Prozesse, die die Dateien blockieren. – KingOfMazes

+1

@KingOfMazes die Datei kann nur gelesen werden, versuchen Sie, die Dateiattribute auf normal wie folgt zu setzen File.SetAttributes (fileName, FileAttributes.Normal); –