2016-09-27 6 views
2

Wie kommt es, dass ein Fehler für Dateien, die "beschädigt" sind, aber nicht in dem Ordner, der nach ~ $ test.docx gesucht wird. Kann ich irgendwie ignorieren diese Dateien?Die Datei scheint korrupt zu sein

string path ="D:/Users/Bole/TSM/"; 
     foreach (string file in Directory.EnumerateFiles(path,"*.docx")) 
     { 
      { 
       //Open the doc File 
       var wordApplication = new Microsoft.Office.Interop.Word.Application(); 
       var document = wordApplication.Documents.Open(file); 
+0

Sie sind temporäre Dateien und haben das Präfix '~ $'. [Es gibt ein Microsoft Support-Dokument] (https://support.microsoft.com/en-ie-/kb/211632), das sie in Bezug auf Word erklärt. – Petesh

+0

@Petesh Wie kann ich das ignorieren? – TamoDaleko

+0

Ich muss mich selbst für die ~ $ Dateien korrigieren; Sie sind tatsächlich "Besitzer" -Dateien, um anzuzeigen, wer die Datei geöffnet hat. Rory.ap's korrigierte Antwort sollte es jedoch abdecken. – Petesh

Antwort

2

Es könnte, da dies so einfach sein, wenn ich Sie richtig verstehen:

var fileInfo = new FileInfo(file); 

if (!fileInfo.Name.StartsWith("~$")) 
{ 
    var wordApplication = new Microsoft.Office.Interop.Word.Application(); 
    var document = wordApplication.Documents.Open(file);  
} 

Zusätzlich (wie Panagiotis Kanavos wies darauf hin), Sie tun sich selbst keinen Gefallen, indem Sie Directory.EnumerateFiles() mit die foreach. Der Grund dafür ist, dass die Methode MoveNext des Enumerators bei jeder Schleife FindNextFile() aufruft, sodass neue Dateien in den Ergebnissen angezeigt werden können. Da eine neue ~$...docx Datei jedes Mal, diese Aussage läuft erstellt wird (siehe this für eine Erklärung, warum dies geschieht):

var document = wordApplication.Documents.Open(file); 

Sie über diese Dateien zu kommen, gehen wie der Looping weiter. Dies kann vermieden werden, indem Directory.GetFiles() anstelle von Directory.EnumerateFiles() verwendet wird, da ersteres nur ein Array von Dateipfaden zurückgibt, das sich nicht ändert, wenn Sie es durchlaufen; d. h. es ist nur eine statische Liste von Dateien, die unter beginnend mit der Schleife erstellt wird, die Dateien ignoriert, die erstellt werden während das Looping geschieht.

+0

Netter Versuch wäre so einfach, aber irgendwie gibt es immer noch einen Fehler Die Datei scheint beschädigt zu sein. – TamoDaleko

+0

Warum wird ein Fehler ausgelöst, wenn er nicht einmal versucht, ihn zu öffnen? Das ist der springende Punkt des 'if'-Blocks. –

+0

Gute Antwort, aber AFAIK wird nicht die 'Datei'-Zeichenfolge den vollständigen Pfad sein? Wäre nicht '.Contains (" $ ") besser geeignet? –

Verwandte Themen