2012-01-13 70 views
9

给定NSFileWrapper对象(对于文件或目录),有什么办法可以获得磁盘上实际文件位置的完整路径吗?获取NSFileWrapper的路径

[fileWrapper filename]只返回文件名,而不是路径,所以它不是我正在寻找的。

+1

如果你正在使用'NSDocument' .... http://www.zedkep.com/blog/index.php?/archives/197-Determining-a-full-file-path-from-an -NSFileWrapper.html – 2012-01-13 05:21:18

+0

我正在使用'NSDocument',并且我确实看到了这篇文章。我唯一担心的是文档可能会在打开时移动到新的位置,并且这是透明处理的。但是如果我尝试通过旧路径访问文件,它会崩溃。 – Greg 2012-01-13 09:23:53

+0

在'NSDocument'中是否有回调函数来告诉我文件在物理上移动还是重命名? – Greg 2012-01-13 09:25:21

回答

3

不,没有办法从NSFileWrapper获得完整路径。

+0

如果您在'NSDcoument'中使用'NSFileWrapper',有一种方法。看到我的答案。 – hpique 2012-08-29 16:48:41

1

如果您使用的是NSDocument,您可以通过一些小技巧获得常规文件文件包装的路径。

首先创建一个NSFileWrapper子类,并重载接收URL以存储其副本的常规文件方法。

@implementation RMFileWrapper 

- (id) initWithURL:(NSURL *)url options:(NSFileWrapperReadingOptions)options error:(NSError *__autoreleasing *)outError { 
    if (self = [super initWithURL:url options:options error:outError]) { 
     self.originalURL = url; 
    } 
    return self; 
} 

- (BOOL) readFromURL:(NSURL *)url options:(NSFileWrapperReadingOptions)options error:(NSError *__autoreleasing *)outError { 
    BOOL successful = [super readFromURL:url options:options error:outError]; 
    if (successful) { 
     self.originalURL = url; 
    } 
    return successful; 
} 

@end 

然后添加此NSFileWrapper类别:如果有

@implementation NSFileWrapper(bestURLWithDocument) 

- (NSURL*) bestURLInDocument:(SBDocument*)document { 
    if (document.fileURL && self.filename) { 
     NSString* path = [document.fileURL.path stringByAppendingPathComponent:self.filename]; 
     return [NSURL fileURLWithPath:path]; 
    } else if ([self isKindOfClass:[RMFileWrapper class]]) { 
     RMFileWrapper *fileWrapper = (RMFileWrapper*) self; 
     return fileWrapper.originalURL;   
    } 
    return nil; 
} 

@end 

bestURLInDocument:将返回文件系统节点的URL,或原始文件的URL,如果不。

上面的代码假定你没有嵌套目录文件包装。

+1

你如何将标准的NSFileWrapper类替换为你的自定义子类? – 2013-08-08 12:53:17

+0

此外,这种方法保证了返回的URL很少。如果启用了自动保存功能,则文件的位置只能用于读取或写入,这取决于您何时设法捕获NSURL实例。我已经提交http://openradar.me/14692573 – 2013-08-09 00:43:12

+0

请问这仍然与存储在iCloud中的东西..? – cacau 2014-03-14 09:44:32