Полный URL от FSCopyURLForVolume - PullRequest
0 голосов
/ 10 марта 2012

У меня проблема с получением полного URL для файла с FSCopyURLForVolume. Я использую код из этой проблемы Определите общий ресурс AFP по URL-адресу файла , но он не дает мне полный URL-адрес. Например:

С таким путем, как: /Volume/server/html/index.html

Все, что я получаю, это URL к базовому креплению: nfs://real_server_name/vol

Листовые каталоги и имена файлов пропущены, полный путь доступен в информации о файлах, поэтому должен быть способ получить эту информацию.

EDIT:

После еще нескольких копаний кажется, что я хочу использовать kFSCatInfoParentDirID и kFSCatInfoNodeID для получения идентификатора родителя и узла (файла), но я не уверен, как превратить это в нечто полезное.

Ответы [ 2 ]

2 голосов
/ 30 октября 2013

, поскольку FSPathMakeRef, FSGetCatalogInfo и FSCopyURLForVolume устарели в Mac OS X 10.8. Я модернизировал код для получения сетевого пути UNC на томах, смонтированных в Mac OS X.

    NSError *error=nil; //Error 
    NSURL *volumePath=nil; //result of UNC network mounting path 

    NSString* testPath =@"/Volumes/SCAMBIO/testreport.exe"; //File path to test 

    NSURL *testUrl = [NSURL fileURLWithPath:testPath]; //Create a NSURL from file path
    NSString* mountPath = [testPath stringByDeletingLastPathComponent]; //Get only mounted volume part i.e. /Volumes/SCAMBIO
    NSString* pathComponents = [testPath substringFromIndex:[mountPath length]]; //Get the rest of the path starting after the mounted path i.e. /testereport.exe
   [testUrl getResourceValue:&volumePath forKey:NSURLVolumeURLForRemountingKey error:&error]; //Get real UNC network mounted path i.e. smb://....

    NSLog(@"Path: %@%@", volumePath,pathComponents); //Write result to debug console

В моем случае это путь, Path: smb: //FRANCESCO@192.168.69.44/SCAMBIO/testreport.exe

Вам необходимо указать подключенный сетевой том.

ciao.

0 голосов
/ 10 марта 2012

Решение этой проблемы было предложено на Apple Dev Forums , вот последняя функция, которую я придумал:

- (NSURL *)volumeMountPathFromPath:(NSString *)path{
    NSString *mountPath = nil;
    NSString *testPath = [path copy];
    while(![testPath isEqualToString:@"/"]){
        NSURL *testUrl = [NSURL fileURLWithPath:testPath];
        NSNumber *isVolumeKey;
        [testUrl getResourceValue:&isVolumeKey forKey:NSURLIsVolumeKey error:nil];
        if([isVolumeKey boolValue]){
            mountPath = testPath;
            break;
        }        
        testPath = [testPath stringByDeletingLastPathComponent];
    }

    if(mountPath == nil){
        return nil;
    }

    NSString *pathCompointents = [path substringFromIndex:[mountPath length]];

    FSRef pathRef;
    FSPathMakeRef((UInt8*)[path fileSystemRepresentation], &pathRef, NULL);
    FSCatalogInfo catalogInfo;
    OSErr osErr = FSGetCatalogInfo(&pathRef, kFSCatInfoVolume|kFSCatInfoParentDirID,
                                   &catalogInfo, NULL, NULL, NULL);
    FSVolumeRefNum volumeRefNum = 0;
    if(osErr == noErr){
        volumeRefNum = catalogInfo.volume;
    }

    CFURLRef serverLocation;
    OSStatus result = FSCopyURLForVolume(volumeRefNum, &serverLocation);
    if(result == noErr){
        NSString *fullUrl = [NSString stringWithFormat:@"%@%@", 
                             CFURLGetString(serverLocation), pathCompointents];        
        return [NSURL URLWithString:fullUrl];
    }else{
        NSLog(@"Error getting the mount path: %i", result);
    }
    return nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...