Проверьте, доступен ли путь под закладкой в ​​​​области приложения для записи внутри изолированного приложения.

У меня есть приложение 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

Я что-то не так делаю или проблема с файловым менеджером внутри песочницы? Есть ли достойный способ проверить, доступен ли подкаталог для записи, то есть без создания файлов?


person Ian Bytchek    schedule 10.02.2016    source источник
comment
это выглядит для меня, как и ожидалось. пока файл не существует, нечего читать и записывать, и, следовательно, доступ не предоставляется. Вы пытались использовать NSURLKeys? NSURLIsReadableKey в NSURL — (BOOL) getResourceValue: (out id *) значение forKey: (NSString *) ключ   -  person mahal tertin    schedule 11.02.2016
comment
Начинать доступ к нему не имеет смысла, я поставил его просто для того, чтобы продемонстрировать, что его использование не имеет значения. Ключевым моментом является то, что isWritableFileAtPath возвращает false, а path фактически доступен для записи. Есть некоторая правда в том, что нет файла = нет права на запись, но в среде без песочницы он отлично работает для несуществующих файлов, и я научился ожидать, что он будет работать именно так де-факто. Похоже на достойное решение, чтобы за кулисами проверить, доступен ли каталог для записи, и вернуть true для несуществующих файлов в песочнице. Вместо этого, похоже, что теперь это нужно делать каждый раз вручную.   -  person Ian Bytchek    schedule 12.02.2016
comment
@IanBytchek - удалось найти решение? Я сталкиваюсь с той же проблемой.   -  person kev    schedule 12.04.2017
comment
@kev нет, не повезло… Я несколько дней бился головой о стену, проверяя все, что мог найти, и отказался от использования try catch и других проверок, где это необходимо. Песочница поставляется с некоторыми ошибочными случаями, я использую флаг компилятора -DSANDBOX, чтобы обрабатывать некоторые такие случаи по-другому. Кроме этого ничего посоветовать не могу. Если вы пойдете трудным путем и найдете решение, пожалуйста, поделитесь! :)   -  person Ian Bytchek    schedule 12.04.2017
comment
@IanBytchek Если вы запускаете доступ к файлу только в том случае, если он не читается, помогает ли это вам? if let path = url?.path where NSFileManager.defaultManager().isReadableFileAtPath(path) == false { url?.startAccessingSecurityScopedResource(); }   -  person kev    schedule 13.04.2017
comment
Я должен попробовать. Это сработало? IsWritableFileAtPath также работает?   -  person Ian Bytchek    schedule 13.04.2017