我的OSX应用程序旨在监视用户选择的计算机上的文件夹。很简单,我有一个扫描目录的函数:
- (NSError*)scan:(NSString*)dir {
NSError *err = nil;
NSArray *filenames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:&err];
for(NSString* fn in filenames) {
NSString *fp = [dir stringByAppendingPathComponent:fn];
BOOL isDir;
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:fp isDirectory:&isDir];
if(exists && isDir) {
[self scan:fp];
}
else {
[self handleFile:fp];
}
}
NSLog(@"Scanning %@: %@",dir,err);
return err;
}
当我第一次启动应用程序时,我会提供一个UI来选择文件夹,然后立即扫描它。操作效果很好(没有错误)。
当我重新启动应用程序时,我尝试再次扫描目录,但这次NSLog
吐出错误:
Scanning /Users/zane/Dropbox/Gifs: Error Domain=NSCocoaErrorDomain Code=257 "The file “Gifs” couldn’t be opened because you don’t have permission to view it." UserInfo=0x608000476d40 {NSFilePath=/Users/zane/Dropbox/Gifs, NSUserStringVariant=(
Folder
), NSUnderlyingError=0x60800005d3d0 "The operation couldn’t be completed. (OSStatus error -5000.)"}
请注意,路径未更改。
我怀疑问题与.entitlements
有关。这就是我所拥有的:
答案 0 :(得分:3)
如果您要使用用户已选择的相同文件或文件夹,则需要在用户选择该路径时将路径另存为安全范围的书签。用户重新启动应用程序时,请读取其书签数据,以便使用保存的路径。在this page的中间有一个安全范围书签的描述。使用NSURL的 URLByResolvingBookmarkData 方法返回安全范围的书签。使用 bookmarkDataWithOptions 方法或NSURL的等效方法来恢复安全范围的书签。