2014-09-03 3 views
1

У меня есть два типа файлов в папке ICloud в Docs:Как узнать, закодирован ли файл?

  1. Текстовые файлы
  2. закодированные с протоколом NSCoding

Оба типа использует расширение .txt. Как узнать, был ли файл закодирован?

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

var doc = MyCloudDocumentType1(fileURL: url) 
doc.openWithCompletionHandler { (success: Bool) -> Void in 
    if success { 
     println("Doc. opened") 
    } 
} 

когда UIDocument пытается загрузить содержимое файла, я получаю исключение при попытке разархивировать текстовый файл:

override func loadFromContents(contents: AnyObject!, ofType typeName: String!, error outError: NSErrorPointer) -> Bool { 
    if (contents as NSData).length == 0 { 
     return false 
    } 
    NSKeyedUnarchiver.unarchiveObjectWithData(contents as NSData) 
    return true 
} 

исключение обстреляно NSKeyedUnarchiver.unarchiveObjectWithData(contents as NSData), указывая, что есть недопустимый аргумент :

'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive 

Это исключение имеет смысл, поскольку я пытаюсь декодировать текстовый файл (файл, который не закодирован). Проблема в том, что я не могу поймать исключение в swift, и к тому времени, когда я знаю, что файл не является закодированным, слишком поздно что-то делать.

Как узнать, был ли закодирован файл? Каков наилучший способ определить, закодирован ли файл и, таким образом, кодируется?

Спасибо!

******РЕШЕНИЕ******

На основе замечаний @AlainCollins, я прочитал первые 4 байта закодированного файла, как это будет моя магия номер:

var magicNumber = [UInt](count: 4, repeatedValue: 0) 
data.getBytes(&magicNumber, length: 4 * sizeof(UInt)) 

Затем я сравнил первые 4 байта каждого файла в папке Docs с этим магическим числом.

+0

Относительно того, почему нет быстрых попыток, здесь [ссылка] (http://stackoverflow.com/questions/24023112/try-catch-exceptions-in-swift) –

ответ

1

Если вы действительно хотите знать, какой формат файла, проверьте магическое число: http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files

Если вы просто хотите, чтобы пережить ошибку, следовать советам попробовать/поймать AJGM в.

+0

Пожалуйста, не задумывайтесь о том, подробнее об этом? –

+0

Вы можете прочитать первые несколько байтов файла и сопоставить его со списком «зарегистрированных» магических чисел. Например, zip'ed файл будет начинаться с шестнадцатеричных цифр «50 4b»; файл gzip'ed с «1f 8b». Это будет более точно, если это полезно. –

+0

Спасибо, это указывает на меня в правильном направлении, хотя я не знал, как читать только 4 байта: P Я отправляю полное решение в свой вопрос. –

Смежные вопросы