Как найти типы файлов в цель c - PullRequest
2 голосов
/ 07 марта 2011

Я провел много исследований по этому вопросу и не нашел ничего полезного. Я хочу сделать простую программу в целях c для личного использования, которая открывает файлы и дает информацию о них. Единственная проблема, с которой я столкнулся, заключается в том, что я не могу найти файл открываемого файла. Не глядя просто на расширение, есть ли способ найти полный формат файла в файле c?

Если возможно, я также хотел бы сохранить этот файл в другом формате. Информация на эту тему также важна для этого приложения. Помощь будет принята с благодарностью.

Ответы [ 3 ]

6 голосов
/ 07 марта 2011

Mac OS X имеет информацию о типе, прикрепленную к каждому файлу, которая указывает, какой тип файла должен быть. Эта информация предоставляется приложением, которое в последний раз сохранило файл, поэтому оно не обязательно является правильным. Кроме того, новые версии OS X игнорируют эту информацию и полностью исчезают из расширения файла. Однако информация все еще сохраняется и может быть получена с помощью метода attributesOfItemAtPath:error: NSFileManager.

Как упомянуто выше quixoto, OS X теперь отображает расширения на UTI. UTI файла может быть получена с помощью NSWorkspace, который также может сказать вам, что означает UTI. Этот код получит локализованное описание файла на /full/path/to/file:

NSWorkspace *ws = [NSWorkspace sharedWorkspace];
NSString *description = [ws localizedDescriptionForType:[ws typeOfFile:@"/full/path/to/file" error:nil]];

Метод typeOfFile:error: требует абсолютного пути.

3 голосов
/ 07 марта 2011

Подумайте: что вы подразумеваете под "полным форматом файла"? Какие файлы и уровень детализации вас интересуют?

Вы не можете получить информацию о «форматировании» из файловой системы так, как вам хочется. Хотите верьте, хотите нет, но файловая система не знает, в каком формате находятся файлы.

Файловые системы традиционно хранят файлы в виде потока байтов с именем, размером и некоторыми другими атрибутами («скрытые», разрешения и т. Д.). Это все, за что он отвечает, и проблема приложения состоит в том, чтобы прочитать эти байты и интерпретировать их как нечто полезное.

Расширение является традиционной подсказкой приложению о том, что содержит файл, но, как вы можете догадаться, это, безусловно, не проверенная гарантия.

Современная Mac OS X имеет Quick Look, который использует общесистемную инфраструктуру, которая добавляет некоторые интеллектуальные возможности поверх этого, с отображениями между расширениями и UTI , которые являются более богатым понятием типа файла. Документы здесь . Я не думаю, что есть способ запросить эту систему для сопоставления между расширениями и UTI, но я не уверен.

Загрузка файла одного формата и сохранение в другом на 100% зависит от типов файлов, о которых вы говорите, и вам придется задавать очень конкретные вопросы о конкретных форматах, если вы действительно хотите добиться этого. (И эта тема расширяет хорошо за пределы пары вызовов встроенных методов в Какао.)

1 голос
/ 22 февраля 2013

Эта информация теперь (начиная с OS X 10.5) обрабатывается через UTI.

Вы можете получить ее так:

NSURL *desktopURL = [[[NSFileManager defaultManager] URLsForDirectory: NSDesktopDirectory
                                                       inDomains: NSUserDomainMask] lastObject];

NSURL *workingdirURL = [desktopURL URLByAppendingPathComponent:@"WorkingDir" isDirectory:YES];

NSArray *docURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:workingdirURL 
                                                 includingPropertiesForKeys:@[NSURLTypeIdentifierKey] options:NSDirectoryEnumerationSkipsHiddenFiles 
                                                                      error: nil];

NSMutableArray *pdfURLs = [NSMutableArray array];

for (NSURL *docURL in docURLs) {
    id resourceValue;
    BOOL found = [docURL getResourceValue: &resourceValue
                                   forKey: NSURLTypeIdentifierKey
                                    error: nil];

    if ( found && [resourceValue isEqual:@"com.adobe.pdf"]) {
        [pdfURLs addObject: docURL];
    }
}

Вы можете увидеть документы для получения дополнительной информации о свойствах файла, которые можно получить таким способом.С помощью этого метода доступно довольно много информации.

...