Wykryj Format pliku i sprawdź zgodność formatu

Czasami konieczne jest określenie formatu dokumentu przed otwarciem, ponieważ rozszerzenie pliku nie gwarantuje, że zawartość pliku jest odpowiednia. Na przykład wiadomo, że Crystal Reports często wyświetla dokumenty w formacie RTF, ale daje im.rozszerzenie doc.

Aspose.Words umożliwia uzyskanie informacji o typie pliku w celu uniknięcia wyjątku, jeśli nie masz pewności, jaka jest rzeczywista zawartość pliku.

Wykryj Format pliku bez wyjątku

Gdy masz do czynienia z wieloma dokumentami w różnych formatach plików, może być konieczne oddzielenie tych plików, które mogą być przetwarzane przez Aspose.Words, od tych, które nie mogą. Możesz również dowiedzieć się, dlaczego niektórych dokumentów nie można przetworzyć.

Jeśli spróbujesz załadować plik do obiektu Document i Aspose.Words nie rozpoznasz formatu pliku lub format nie jest obsługiwany, Aspose.Words zgłosi wyjątek. Możesz złapać te wyjątki i przeanalizować je, ale Aspose.Words zapewnia również metodę DetectFileFormat, która pozwala nam szybko określić format pliku bez ładowania dokumentu z możliwymi wyjątkami. Ta metoda zwraca obiekt FileFormatInfo, który zawiera wykryte informacje o typie pliku.

Sprawdź Zgodność Formatu Plików

Możemy sprawdzić zgodność formatów wszystkich plików w wybranym folderze i posortować je według formatu do odpowiednich podfolderów.

Ponieważ mamy do czynienia z zawartością w folderze, pierwszą rzeczą, którą musimy zrobić, to pobrać kolekcję wszystkich plików w tym folderze przy użyciu metody GetFiles klasy Directory (z przestrzeni nazw System.IO).

Poniższy przykład kodu pokazuje, jak uzyskać listę wszystkich plików w folderze:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::ArrayPtr<System::String> fileList = System::IO::Directory::GetFiles(dataDir);

Po zebraniu wszystkich plików reszta pracy jest wykonywana metodą DetectFileFormat, która sprawdza format pliku.

Poniższy przykład kodu pokazuje, jak iterować zebraną listę plików, sprawdzić format KAŻDEGO pliku i przenieść każdy plik do odpowiedniego folderu:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directory.
System::String dataDir = GetInputDataDir_LoadingAndSaving();
System::String supportedDir = dataDir + u"Supported_out";
System::String unknownDir = dataDir + u"Unknown_out";
System::String encryptedDir = dataDir + u"Encrypted_out";
System::String pre97Dir = dataDir + u"Pre97_out";
// Create the directories if they do not already exist
if (!System::IO::Directory::Exists(supportedDir))
{
System::IO::Directory::CreateDirectory_(supportedDir);
}
if (!System::IO::Directory::Exists(unknownDir))
{
System::IO::Directory::CreateDirectory_(unknownDir);
}
if (!System::IO::Directory::Exists(encryptedDir))
{
System::IO::Directory::CreateDirectory_(encryptedDir);
}
if (!System::IO::Directory::Exists(pre97Dir))
{
System::IO::Directory::CreateDirectory_(pre97Dir);
}
System::ArrayPtr<System::String> fileList = System::IO::Directory::GetFiles(dataDir);
// Loop through all found files.
for (System::String const &fileName: fileList)
{
// Extract and display the file name without the path.
System::String nameOnly = System::IO::Path::GetFileName(fileName);
std::cout << nameOnly.ToUtf8String();
// Check the file format and move the file to the appropriate folder.
System::SharedPtr<FileFormatInfo> info = FileFormatUtil::DetectFileFormat(fileName);
// Display the document type.
switch (info->get_LoadFormat())
{
case LoadFormat::Doc:
std::cout << "\tMicrosoft Word 97-2003 document." << std::endl;
break;
case LoadFormat::Dot:
std::cout << "\tMicrosoft Word 97-2003 template." << std::endl;
break;
case LoadFormat::Docx:
std::cout << "\tOffice Open XML WordprocessingML Macro-Free Document." << std::endl;
break;
case LoadFormat::Docm:
std::cout << "\tOffice Open XML WordprocessingML Macro-Enabled Document." << std::endl;
break;
case LoadFormat::Dotx:
std::cout << "\tOffice Open XML WordprocessingML Macro-Free Template." << std::endl;
break;
case LoadFormat::Dotm:
std::cout << "\tOffice Open XML WordprocessingML Macro-Enabled Template." << std::endl;
break;
case LoadFormat::FlatOpc:
std::cout << "\tFlat OPC document." << std::endl;
break;
case LoadFormat::Rtf:
std::cout << "\tRTF format." << std::endl;
break;
case LoadFormat::WordML:
std::cout << "\tMicrosoft Word 2003 WordprocessingML format." << std::endl;
break;
case LoadFormat::Html:
std::cout << "\tHTML format." << std::endl;
break;
case LoadFormat::Mhtml:
std::cout << "\tMHTML (Web archive) format." << std::endl;
break;
case LoadFormat::Odt:
std::cout << "\tOpenDocument Text." << std::endl;
break;
case LoadFormat::Ott:
std::cout << "\tOpenDocument Text Template." << std::endl;
break;
case LoadFormat::DocPreWord60:
std::cout << "\tMS Word 6 or Word 95 format." << std::endl;
break;
case LoadFormat::Unknown:
default:
std::cout << "\tUnknown format." << std::endl;
break;
}
// Now copy the document into the appropriate folder.
if (info->get_IsEncrypted())
{
std::cout << "\tAn encrypted document." << std::endl;
System::IO::File::Copy(fileName, System::IO::Path::Combine(encryptedDir, nameOnly), true);
}
else
{
switch (info->get_LoadFormat())
{
case LoadFormat::DocPreWord60:
System::IO::File::Copy(fileName, System::IO::Path::Combine(pre97Dir, nameOnly), true);
break;
case LoadFormat::Unknown:
System::IO::File::Copy(fileName, System::IO::Path::Combine(unknownDir, nameOnly), true);
break;
default:
System::IO::File::Copy(fileName, System::IO::Path::Combine(supportedDir, nameOnly), true);
break;
}
}
}

Pliki są przenoszone do odpowiednich podfolderów przy użyciu metody Move klasy File z tej samej przestrzeni nazw System.IO.

Poniższe pliki są używane w powyższym przykładzie. Nazwa pliku znajduje się po lewej stronie, a jego opis po prawej:

Grupa plików Dokument Wejściowy Rodzaj
Obsługiwane formaty plików Test File (DOC).doc Microsoft Word 95/6.0 lub Microsoft Word 97 – dokument z 2003 r.
Test File (DOT).dot Microsoft Word 95/6.0 lub Microsoft Word 97 – 2003 szablon.
Test File (DOCX).docx Office Open XML WordprocessingML dokument bez makr.
Test File (DOCM).docm Office Open XML WordprocessingML dokument z makrami.
Test File (DOTX).dotx Biuro Otwarte XML WordprocessingML szablon.
Test File (DOTM).dotm Office Open XML WordprocessingML szablon z makrami.
Test File (XML).xml FlatOPC OOXML Dokument.
Test File (RTF).rtf Dokument w formacie tekstu sformatowanego.
Test File (WordML).xml Microsoft Word 2003 WordprocessingML Dokument.
Test File (HTML).html HTML dokument.
Test File (MHTML).mhtml MHTML (archiwum internetowe) dokument.
Test File (ODT).odt OpenDocument Tekst (OpenOffice Pisarz).
Test File (OTT).ott OpenDocument Szablon Dokumentu.
Test File (DocPreWord60).doc Microsoft Word 2.0 dokument.
Zaszyfrowane dokumenty Test File (Enc).doc Zaszyfrowany dokument Microsoft Word 95 / 6.0 lub Microsoft Word 97 – 2003.
Test File (Enc).docx Zaszyfrowany dokument Office Open XML WordprocessingML.
Nieobsługiwane formaty plików Test File (JPG).jpg JPEG plik obrazu.