ファイル形式を検出し、形式の互換性をチェックする
ファイル拡張子によってはファイルの内容が適切であることが保証されないため、ドキュメントを開く前に形式を決定する必要がある場合があります。たとえば、Crystal Reports はドキュメントを RTF 形式で出力することが多いですが、ドキュメントには .doc 拡張子が付いていることが知られています。
Aspose.Words は、ファイルの実際の内容が不明な場合に例外を回避するために、ファイル タイプに関する情報を取得する機能を提供します。
例外なくファイル形式を検出
さまざまなファイル形式の複数のドキュメントを扱う場合、Aspose.Words で処理できるファイルと処理できないファイルを分離する必要がある場合があります。一部のドキュメントが処理できない理由を知りたい場合もあります。
ファイルを Document オブジェクトにロードしようとしたときに、Aspose.Words がファイル形式を認識できないか、形式がサポートされていない場合、Aspose.Words は例外をスローします。これらの例外をキャッチして分析することもできますが、Aspose.Words は、例外の可能性があるドキュメントをロードせずにファイル形式を迅速に判断できる DetectFileFormat メソッドも提供します。このメソッドは、ファイルの種類について検出された情報を含む FileFormatInfo オブジェクトを返します。
ファイル形式の互換性を確認する
選択したフォルダー内のすべてのファイルの形式の互換性をチェックし、形式ごとに対応するサブフォルダーに分類できます。
フォルダー内のコンテンツを処理しているため、最初に行う必要があるのは、Directory
クラスの GetFiles メソッドを (System.IO
名前空間から) 使用して、このフォルダー内のすべてのファイルのコレクションを取得することです。
次のコード例は、フォルダー内のすべてのファイルのリストを取得する方法を示しています。
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// We have a corrupted document for one of the examples in our folder, so exclude it from our collection. | |
IEnumerable<string> fileList = Directory.GetFiles(MyDir).Where(name => !name.EndsWith("Corrupted document.docx")); |
すべてのファイルが収集されると、残りの作業はファイル形式をチェックする DetectFileFormat メソッドによって実行されます。
次のコード例は、収集されたファイルのリストを反復処理し、各ファイルの形式を確認し、各ファイルを適切なフォルダーに移動する方法を示しています。
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
string supportedDir = ArtifactsDir + "Supported"; | |
string unknownDir = ArtifactsDir + "Unknown"; | |
string encryptedDir = ArtifactsDir + "Encrypted"; | |
string pre97Dir = ArtifactsDir + "Pre97"; | |
// Create the directories if they do not already exist. | |
if (Directory.Exists(supportedDir) == false) | |
Directory.CreateDirectory(supportedDir); | |
if (Directory.Exists(unknownDir) == false) | |
Directory.CreateDirectory(unknownDir); | |
if (Directory.Exists(encryptedDir) == false) | |
Directory.CreateDirectory(encryptedDir); | |
if (Directory.Exists(pre97Dir) == false) | |
Directory.CreateDirectory(pre97Dir); | |
// We have a corrupted document for one of the examples in our folder, so exclude it from our collection. | |
IEnumerable<string> fileList = Directory.GetFiles(MyDir).Where(name => !name.EndsWith("Corrupted document.docx")); | |
foreach (string fileName in fileList) | |
{ | |
string nameOnly = Path.GetFileName(fileName); | |
Console.Write(nameOnly); | |
// Display the document type. | |
FileFormatInfo info = FileFormatUtil.DetectFileFormat(fileName); | |
switch (info.LoadFormat) | |
{ | |
case LoadFormat.Doc: | |
Console.WriteLine("\tMicrosoft Word 97-2003 document."); | |
break; | |
case LoadFormat.Dot: | |
Console.WriteLine("\tMicrosoft Word 97-2003 template."); | |
break; | |
case LoadFormat.Docx: | |
Console.WriteLine("\tOffice Open XML WordprocessingML Macro-Free Document."); | |
break; | |
case LoadFormat.Docm: | |
Console.WriteLine("\tOffice Open XML WordprocessingML Macro-Enabled Document."); | |
break; | |
case LoadFormat.Dotx: | |
Console.WriteLine("\tOffice Open XML WordprocessingML Macro-Free Template."); | |
break; | |
case LoadFormat.Dotm: | |
Console.WriteLine("\tOffice Open XML WordprocessingML Macro-Enabled Template."); | |
break; | |
case LoadFormat.FlatOpc: | |
Console.WriteLine("\tFlat OPC document."); | |
break; | |
case LoadFormat.Rtf: | |
Console.WriteLine("\tRTF format."); | |
break; | |
case LoadFormat.WordML: | |
Console.WriteLine("\tMicrosoft Word 2003 WordprocessingML format."); | |
break; | |
case LoadFormat.Html: | |
Console.WriteLine("\tHTML format."); | |
break; | |
case LoadFormat.Mhtml: | |
Console.WriteLine("\tMHTML (Web archive) format."); | |
break; | |
case LoadFormat.Odt: | |
Console.WriteLine("\tOpenDocument Text."); | |
break; | |
case LoadFormat.Ott: | |
Console.WriteLine("\tOpenDocument Text Template."); | |
break; | |
case LoadFormat.DocPreWord60: | |
Console.WriteLine("\tMS Word 6 or Word 95 format."); | |
break; | |
case LoadFormat.Unknown: | |
Console.WriteLine("\tUnknown format."); | |
break; | |
} | |
if (info.IsEncrypted) | |
{ | |
Console.WriteLine("\tAn encrypted document."); | |
File.Copy(fileName, Path.Combine(encryptedDir, nameOnly), true); | |
} | |
else | |
{ | |
switch (info.LoadFormat) | |
{ | |
case LoadFormat.DocPreWord60: | |
File.Copy(fileName, Path.Combine(pre97Dir, nameOnly), true); | |
break; | |
case LoadFormat.Unknown: | |
File.Copy(fileName, Path.Combine(unknownDir, nameOnly), true); | |
break; | |
default: | |
File.Copy(fileName, Path.Combine(supportedDir, nameOnly), true); | |
break; | |
} | |
} | |
} |
ファイルは、File
クラスの Move
メソッドを使用して、同じ System.IO
名前空間から適切なサブフォルダーに移動されます。
上記の例では次のファイルが使用されています。ファイル名が左側にあり、その説明が右側にあります。
ファイルのGroup | 入力ドキュメント | タイプ |
---|---|---|
サポートされているファイル形式 | テスト ファイル (ドキュメント).doc | Microsoft Word 95/6.0 または Microsoft Word 97 – 2003 ドキュメント。 |
テストファイル(Dot ).dot |
Microsoft Word 95/6.0 または Microsoft Word 97 – 2003 テンプレート。 | |
テスト ファイル (Docx).docx | Office Open XML WordprocessingML ドキュメント (マクロなし)。 | |
テスト ファイル (Docm).docm | Office Open XML WordprocessingML ドキュメントとマクロ。 | |
テスト ファイル (Dotx).dotx | Office Open XML WordprocessingML テンプレート。 | |
テストファイル (Dotm).dotm | マクロを備えた Office Open XML WordprocessingML テンプレート。 | |
テストファイル(XML).xml | FlatOPC OOXML ドキュメント。 | |
テストファイル(RTF).rtf | リッチテキスト形式のドキュメント。 | |
テストファイル(WordML).xml | Microsoft Word 2003 WordprocessingML ドキュメント。 | |
テストファイル(HTML).html | HTMLドキュメント。 | |
テストファイル(MHTML).mhtml | MHTML (Web アーカイブ) ドキュメント。 | |
テストファイル(Odt).odt | OpenDocument テキスト (OpenOffice Writer)。 | |
テストファイル(オット).ott | OpenDocument ドキュメント テンプレート。 | |
テスト ファイル (DocPreWord60).doc | Microsoft Word 2.0 ドキュメント。 | |
暗号化された文書 | テスト ファイル (Enc).doc | 暗号化された Microsoft Word 95/6.0 または Microsoft Word 97 – 2003 ドキュメント。 |
テストファイル(Enc).docx | 暗号化された Office Open XML WordprocessingML ドキュメント。 | |
サポートされていないファイル形式 | テストファイル(JPG).jpg | JPEG画像ファイル。 |