Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get path for NSFileWrapper

Given an NSFileWrapper object (for a file or directory), is there any way to get the full path for the location of the actual file on the disk?

[fileWrapper filename] only returns the file name, not the path, so it isn't what I'm looking for.

like image 526
Greg Avatar asked Jan 13 '12 05:01

Greg


2 Answers

No, there's no way to get the full path from NSFileWrapper.

like image 143
Costique Avatar answered Nov 19 '22 16:11

Costique


If you're using NSDocument you can get the path of regular-file file wrappers with a little hack.

First create a NSFileWrapper subclass and overload the regular-file methods that receive a URL to store a copy of it.

@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

Then add this NSFileWrapper category:

@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: will return the url of the file-system node if available, or the original file url if not.

The above code assumes that you're not nesting directory file wrappers.

like image 26
hpique Avatar answered Nov 19 '22 16:11

hpique