【问题标题】:Get path for NSFileWrapper获取 NSFileWrapper 的路径
【发布时间】:2012-01-13 05:08:02
【问题描述】:

给定一个 NSFileWrapper 对象(用于文件或目录),有没有办法获取磁盘上实际文件位置的完整路径?

[fileWrapper filename] 只返回文件名,而不是路径,所以它不是我要找的。​​p>

【问题讨论】:

  • 如果您使用的是NSDocument....zedkep.com/blog/index.php?/archives/…
  • 我正在使用NSDocument,我确实看到了那个帖子。我唯一担心的是文档在打开时可能会移动到新位置,这是透明处理的。但是如果我尝试通过旧路径访问文件,它会崩溃。
  • NSDocument 中是否有回调函数告诉我文件何时物理移动或重命名?

标签: iphone objective-c ios macos nsfilewrapper


【解决方案1】:

不,无法从NSFileWrapper 获取完整路径。

【讨论】:

  • 如果您在NSDcoument 中使用NSFileWrapper,有一种方法。看我的回答。
【解决方案2】:

如果您使用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。

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

【讨论】:

  • 你如何用标准的 NSFileWrapper 类代替你的自定义子类?
  • 另外,这个方法在返回的 URL 方面保证很少。如果启用了自动保存,则文件的位置仅适用于读取或写入,具体取决于您何时设法捕获 NSURL 实例。我已经提交了openradar.me/14692573
【解决方案3】:

您可以将路径组件附加到 UIDocument 文件 URL。

Swift 5.2

document.fileURL.appendingPathComponent("MyFolder", isDirectory: true).appendingPathComponent("MyImage.png", isDirectory: false)

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2020-12-16
    • 2011-06-30
    • 2012-11-27
    • 2016-04-13
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多