Определение формата файла и проверка совместимости форматов
Иногда необходимо определить формат документа перед открытием, поскольку расширение файла не гарантирует, что содержимое файла соответствует действительности. Например, известно, что Crystal Reports часто выводит документы в формате RTF, но присваивает им расширение .doc.
Aspose.Words предоставляет возможность получения информации о типе файла, чтобы избежать исключения, если вы не уверены в фактическом содержимом файла.
Определение формата файла без каких-либо исключений
Когда вы имеете дело с несколькими документами в различных форматах, вам может потребоваться отделить те файлы, которые могут быть обработаны с помощью Aspose.Words, от тех, которые не могут. Возможно, вы также захотите узнать, почему некоторые документы не могут быть обработаны.
Если вы попытаетесь загрузить файл в объект Document и Aspose.Words не сможет распознать формат файла или формат не поддерживается, Aspose.Words вызовет исключение. Вы можете перехватить эти исключения и проанализировать их, но Aspose.Words также предоставляет метод DetectFileFormat, который позволяет нам быстро определить формат файла, не загружая документ с возможными исключениями. Этот метод возвращает объект FileFormatInfo, содержащий обнаруженную информацию о типе файла.
Проверьте совместимость форматов файлов
Мы можем проверить совместимость форматов всех файлов в выбранной папке и отсортировать их по формату в соответствующие подпапки.
Поскольку мы имеем дело с содержимым папки, первое, что нам нужно сделать, это получить коллекцию всех файлов в этой папке, используя метод GetFiles класса Directory
(из пространства имен System.IO
).
В следующем примере кода показано, как получить список всех файлов в папке:
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); |
Когда все файлы собраны, остальная часть работы выполняется методом DetectFileFormat, который проверяет формат файла.
В следующем примере кода показано, как выполнить итерацию по собранному списку файлов, проверить формат каждого файла и переместить каждый файл в соответствующую папку:
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; | |
} | |
} | |
} | |
Файлы перемещаются в соответствующие подпапки с помощью метода Move
класса File
из того же пространства имен System.IO
.
В приведенном выше примере используются следующие файлы. Название файла указано слева, а его описание - справа:
Группа файлов | Входной документ | Тип |
---|---|---|
Поддерживаемые форматы файлов | Test File (DOC).doc | Документ Microsoft Word 95/6.0 или Microsoft Word 97 – 2003. |
Test File (DOT).dot | Шаблон Microsoft Word 95/6.0 или Microsoft Word 97 – 2003. | |
Test File (DOCX).docx | Office открывает XML-документ WordprocessingML без макросов. | |
Test File (DOCM).docm | Office открывает XML-документ WordprocessingML с макросами. | |
Test File (DOTX).dotx | Шаблон Office Open XML WordprocessingML. | |
Test File (DOTM).dotm | Office открывает XML-шаблон WordprocessingML с макросами. | |
Test File (XML).xml | Документ FlatOPC OOXML. | |
Test File (RTF).rtf | Документ в формате Rich Text. | |
Test File (WordML).xml | Документ Microsoft Word 2003 WordprocessingML. | |
Test File (HTML).html | HTML-документ. | |
Test File (MHTML).mhtml | Документ в формате MHTML (веб-архив). | |
Test File (ODT).odt | Текст открытого документа (OpenOffice Writer). | |
Test File (OTT).ott | Шаблон документа OpenDocument. | |
Test File (DocPreWord60).doc | Документ Microsoft Word 2.0. | |
Зашифрованные документы | Test File (Enc).doc | Зашифрованный документ Microsoft Word 95/6.0 или Microsoft Word 97 – 2003. |
Test File (Enc).docx | Зашифрованный офисный открытый XML-документ WordprocessingML. | |
Неподдерживаемые форматы файлов | Test File (JPG).jpg | Файл изображения в формате JPEG. |