2009-09-23 4 views
14

Tôi có ứng dụng Cocoa lưu trữ tham chiếu đến các tệp đa phương tiện (hình ảnh, video, v.v.) trên máy tính của người dùng. Tôi tự hỏi nếu có một cách để có được một tham chiếu đến tập tin khác mà sử dụng một đường dẫn tập tin để nếu người dùng di chuyển tập tin đó vào một thư mục khác nhau trên máy tính của họ, tôi vẫn sẽ biết nó ở đâu. Tôi hiện đang lưu trữ các mảng các đường dẫn tập tin đó được truyền lại từ đối thoại cởi mở Cocoa tiêu chuẩn:Giữ một tham chiếu đến một tệp sau khi nó đã di chuyển trong mục tiêu-c?

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

Trả lời

18

Trong OS X 10.6 (Snow Leopard), một NSURL có thể được chuyển đổi sang một URL tham khảo tập tin (sử dụng -[NSURL fileReferenceURL]) tham chiếu đến tệp trên các di chuyển trong khi ứng dụng của bạn đang chạy. Nếu bạn muốn duy trì tham chiếu tệp này, hãy sử dụng +[NSURL writeBookmarkData:toURL:options:error:] chuyển dữ liệu dấu trang được tạo bằng -[NSURL bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error]. Dấu trang có thể được giải quyết sau bằng cách +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:] chuyển dữ liệu dấu trang được trả lại từ +[NSURL bookmarkDataWithContentsOfURL:error:].

Trước OS X 10.6, chức năng tương tự (trừ một số tính năng nhận biết mạng) có sẵn thông qua AliasManager, giao diện thời đại Carbon cho hệ thống bí danh tệp OS X. Có một vài wrapper Objective-C trên đầu trang của Alias ​​Manager mà làm cho việc sử dụng nó từ Cocoa đẹp hơn rất nhiều. Yêu thích của tôi là bổ sung của Wolf Rentzsch cho số điện thoại BDAlias của Chris Hanson (có sẵn trên github).

9

Dưới đây là một ví dụ nhanh của việc sử dụng bookmark để theo dõi các tập tin trên di chuyển:

- (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; 
} 

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

+0

Nhờ ví dụ! – Austin

+0

có hoạt động trong hộp cát không? Hay tôi phải yêu cầu các quyền đặc biệt? –

+0

Tôi biết bạn đã đăng trên GitHub nhưng tôi sẽ để điều này ở đây để hoàn thành. Tôi tin rằng nó sẽ làm việc trong chế độ sandbox (https://github.com/ptrsghr/FileWatcher/pull/1#commits-pushed-02a521c). Hãy cho tôi biết nếu bạn gặp phải bất kỳ vấn đề nào. – rgbrgb