2009-09-23 39 views
14

我有一个Cocoa应用程序,它在用户的计算机上存储对多媒体文件(图像,视频等)的引用。我想知道是否有一种方法可以获得对该文件的引用,即使用文件路径,以便如果用户将该文件移动到其计算机上的其他文件夹,我仍然会知道它在哪里。我目前存储的文件路径的阵列被从标准可可公开对话传递回:在移入objective-c后保留对文件的引用?

-(void)addMultimediaDidEnd:(NSOpenPanel*)sheet 
      returnCode:(int)returnCode 
      contextInfo:(NSString *)contextInfo 
{ 
    if(returnCode == NSOKButton) { 
     [sheet orderOut:nil]; 
     [self saveFiles:[sheet filenames]]; 
    } 
} 

回答

18

在OS X 10.6(Snow Leopard)上,一个NSURL可以被转换成文件引用URL(使用-[NSURL fileReferenceURL] )当您的应用程序正在运行时,它通过移动引用文件。如果要保留此文件参考,请使用+[NSURL writeBookmarkData:toURL:options:error:]传递使用-[NSURL bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error]生成的书签数据。稍后可以通过+[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]传递从+[NSURL bookmarkDataWithContentsOfURL:error:]返回的书签数据来解析书签。

在OS X 10.6之前,可以通过AliasManager(OS X文件别名系统的Carbon时代界面)获得相同的功能(减去一些网络感知细节)。在Alias Manager的顶部有几个Objective-C包装器,它使得Cocoa可以更好地使用它。我最喜欢的是Wolf Rentzsch对Chris Hanson的BDAlias(可在github上获得)的补充。

9

下面是使用书签跨移动跟踪文件的一个简单的例子:

- (NSData *)bookmarkFromURL:(NSURL *)url { 
    NSData *bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark 
        includingResourceValuesForKeys:NULL 
             relativeToURL:NULL 
               error:NULL]; 
    return bookmark; 
} 

- (NSURL *)urlFromBookmark:(NSData *)bookmark { 
    NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark 
              options:NSURLBookmarkResolutionWithoutUI 
            relativeToURL:NULL 
           bookmarkDataIsStale:NO 
              error:NULL]; 
    return url; 
} 

https://github.com/ptrsghr/FileWatcher/blob/master/FileWatcherExample/Classes/FileWatcher.m

+0

感谢您的例子! – Austin 2011-03-09 15:41:51

+0

在沙箱中完成这项工作吗?还是我必须要求特别的权限? – 2012-11-19 18:59:15

+0

我知道你发布在GitHub上,但为了完整起见,我将在此处予以说明。我相信它应该在沙盒模式下工作(https://github.com/ptrsghr/FileWatcher/pull/1#commits-pushed-02a521c)。如果遇到任何问题,请告知我。 – rgbrgb 2012-11-24 18:08:05

相关问题