Detectați formatul fișierului și verificați compatibilitatea formatului

Uneori este necesar să se determine formatul unui document înainte de deschidere, deoarece extensia de fișier nu garantează că conținutul fișierului este adecvat. De exemplu, se știe că Crystal Reports emite adesea documente în format RTF, dar le dă .extensie doc.

Aspose.Words oferă posibilitatea de a obține informații despre tipul de fișier pentru a evita o excepție dacă nu sunteți sigur care este conținutul real al fișierului.

Detectați formatul de fișier fără excepție

Când aveți de-a face cu mai multe documente în diferite formate de fișiere, poate fi necesar să separați acele fișiere care pot fi procesate de Aspose.Words de cele care nu pot. De asemenea, poate doriți să știți de ce unele dintre documente nu pot fi procesate.

Dacă încercați să încărcați un fișier într-un obiect Document și Aspose.Words nu poate recunoaște formatul de fișier sau formatul nu este acceptat, Aspose.Words va arunca o excepție. Puteți prinde aceste excepții și le puteți analiza, dar Aspose.Words oferă și metoda DetectFileFormat care ne permite să determinăm rapid formatul fișierului fără a încărca un document cu posibile excepții. Această metodă returnează un obiect FileFormatInfo care conține informațiile detectate despre tipul de fișier.

Verificați Compatibilitatea Formatului Fișierelor

Putem verifica compatibilitatea formatelor tuturor fișierelor din folderul selectat și le putem sorta după format în subfoldere corespunzătoare.

Deoarece avem de-a face cu conținut într-un folder, primul lucru pe care trebuie să-l facem este să obținem o colecție a tuturor fișierelor din acest folder folosind metoda GetFiles a clasei Directory (din spațiul de nume System.IO).

Următorul exemplu de cod arată cum să obțineți o listă cu toate fișierele din folder:

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);

Când toate fișierele sunt colectate, restul lucrării se face prin metoda DetectFileFormat, care verifică formatul fișierului.

Următorul exemplu de cod arată cum să iterați lista colectată de fișiere, să verificați formatul fiecărui fișier și să mutați fiecare fișier în folderul corespunzător:

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;
}
}
}

Fișierele sunt mutate în subfoldere corespunzătoare folosind metoda Move a clasei File, din același spațiu de nume System.IO.

Următoarele fișiere sunt utilizate în exemplul de mai sus. Numele fișierului este în stânga și descrierea acestuia este în dreapta:

Grup de fișiere Document De Intrare Tip
Formate de fișiere acceptate Test File (DOC).doc Microsoft Word 95/6.0 sau Microsoft Word 97 – 2003 document.
Test File (DOT).dot Microsoft Word 95/6.0 sau Microsoft Word 97 – 2003 șablon.
Test File (DOCX).docx Office Open XML WordprocessingML document fără macrocomenzi.
Test File (DOCM).docm Office Open XML WordprocessingML document cu macrocomenzi.
Test File (DOTX).dotx Birou deschis XML WordprocessingML șablon.
Test File (DOTM).dotm Office Open XML WordprocessingML șablon cu macrocomenzi.
Test File (XML).xml FlatOPC OOXML Document.
Test File (RTF).rtf Document în format text îmbogățit.
Test File (WordML).xml Microsoft Word 2003 WordprocessingML document.
Test File (HTML).html HTML document.
Test File (MHTML).mhtml MHTML (arhivă Web) document.
Test File (ODT).odt OpenDocument Text (OpenOffice Scriitor).
Test File (OTT).ott OpenDocument Șablon De Document.
Test File (DocPreWord60).doc Microsoft Word 2.0 document.
Documente criptate Test File (Enc).doc Criptate Microsoft Word 95/6.0 sau Microsoft Word 97 – 2003 document.
Test File (Enc).docx Birou criptat deschis XML WordprocessingML document.
Formate de fișiere neacceptate Test File (JPG).jpg JPEG fișier imagine.