У меня есть приложение OS X, в котором хранится закладка на уровне приложения для сохранения доступа к определенным каталогам. Я могу писать в эти каталоги без каких-либо проблем, но в моем коде есть часть, где я хочу сделать дополнительную проверку, чтобы убедиться, что путь доступен для записи, и это не удается.
var fileManager: NSFileManager = NSFileManager.defaultManager()
var baseUrl: NSURL = try! NSURL(byResolvingBookmarkData: data, …)
var fileUrl: NSURL = url.URLByAppendingPathComponent("foo.txt")
// Changing this order has no effect, I make only the first start access call,
// the second one is to demonstrate that it's not working.
baseUrl.startAccessingSecurityScopedResource() // true
fileUrl.startAccessingSecurityScopedResource() // false
// File manager confirms that base path is writable, but anything inside
// it – not. This worked perfectly fine before sandboxing the app.
fileManager.isWritableFileAtPath(baseUrl.path!) // true
fileManager.isWritableFileAtPath(fileUrl.path!) // false
// Writing file to the `fileUrl` works anyway, even though
// file manager thinks it's not writable.
writeMyFile(toUrl: fileUrl)
// Here's another interesting observation, is writable starts working
// once the files get created.
fileManager.isWritableFileAtPath(fileUrl.path!) // false
fileManager.createFileAtPath(fileUrl.path!, contents: nil, attributes: nil)
fileManager.isWritableFileAtPath(fileUrl.path!) // true
Я что-то не так делаю или проблема с файловым менеджером внутри песочницы? Есть ли достойный способ проверить, доступен ли подкаталог для записи, то есть без создания файлов?
isWritableFileAtPath
возвращаетfalse
, а path фактически доступен для записи. Есть некоторая правда в том, что нет файла = нет права на запись, но в среде без песочницы он отлично работает для несуществующих файлов, и я научился ожидать, что он будет работать именно так де-факто. Похоже на достойное решение, чтобы за кулисами проверить, доступен ли каталог для записи, и вернутьtrue
для несуществующих файлов в песочнице. Вместо этого, похоже, что теперь это нужно делать каждый раз вручную. - person Ian Bytchek   schedule 12.02.2016try catch
и других проверок, где это необходимо. Песочница поставляется с некоторыми ошибочными случаями, я использую флаг компилятора-DSANDBOX
, чтобы обрабатывать некоторые такие случаи по-другому. Кроме этого ничего посоветовать не могу. Если вы пойдете трудным путем и найдете решение, пожалуйста, поделитесь! :) - person Ian Bytchek   schedule 12.04.2017if let path = url?.path where NSFileManager.defaultManager().isReadableFileAtPath(path) == false { url?.startAccessingSecurityScopedResource(); }
- person kev   schedule 13.04.2017