2016-09-27 3 views
2

「破損している」ファイルにはエラーがスローされますが、検索されるフォルダには存在しません〜$ test.docx どうしても無視できますかこれらのファイル?Readin wordfilesファイルが破損していると表示されます

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

これらは一時ファイルです。接頭辞は '〜$'です。 [マイクロソフトのサポートドキュメントがあります](https://support.microsoft.com/en-ie/kb/211632)Wordとの関連で説明します。 – Petesh

+0

@Peteshどうすれば無視できますか? – TamoDaleko

+0

私は〜$ファイルを修正する必要があります。彼らは実際に誰がファイルを開いたのかを示す「所有者」ファイルです。しかし、rory.apの訂正された答えはそれをカバーするべきです。 – Petesh

答えて

2

私が正しくあなたを理解してる場合には、このような単純なものでした:

var fileInfo = new FileInfo(file); 

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

をさらに(パナギオティスKanavosが指摘したように)、あなたは自分自身でDirectory.EnumerateFiles()を使用して、任意の恩恵をしていませんforeach。その理由は、ループするたびに、列挙子のMoveNextメソッドがFindNextFile()を呼び出すため、新しいファイルが結果に表示される可能性があるからです。新しい~$...docxファイルは、この文が実行されるたびに作成されているので(これが起こる理由の説明のためのthisを参照してください):あなたはループが続くとして、これらのファイルに遭遇するつもりだ

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

。これは、Directory.EnumerateFiles()の代わりにDirectory.GetFiles()を使用することで避けることができます。これは、前者がループしているときに変更されないファイルパスの配列を返すためです。すなわち、に構築されたファイルの静的リストであり、作成されたファイルを無視するループのが開始されます。ループが発生しています。

+0

素敵な試みは簡単ですが、何とかしてもエラーはスローされます。 – TamoDaleko

+0

オープンしようとしてもエラーがスローされるのはなぜですか?これが 'if'ブロックの全体のポイントです。 –

+0

いい答えですが、AFAIKは 'file'文字列が完全なパスではありませんか? '.Contains(〜〜$") 'はうまくいけませんか? –

関連する問題