Монтирование папки как устройства в Finder с использованием какао - PullRequest
1 голос
/ 27 ноября 2008

Есть ли способ смонтировать папку на жестком диске как устройство в Finder. Цель здесь - предоставить пользователю простой способ доступа к папке, которую мое приложение использует для хранения данных. Я не хочу, чтобы мой пользователь отправлялся на поиск данных в Application Data. Я бы предпочел, чтобы они сделали эти данные доступными как подключенный том или устройство в Finder. Я также хотел бы, чтобы этот том или устройство были доступны для чтения / записи, чтобы, если пользователь вносит какие-либо изменения в файлы данных, они будут отражены в исходной папке.

Есть ли способ сделать это в какао, углероде или яблочном сценарии.

Ответы [ 5 ]

4 голосов
/ 27 ноября 2008

Попробуйте заглянуть в FUSE. Вы можете иметь все виды файловых систем psuedo с этим.

Но я бы немного предостерег от того, что вы пытаетесь сделать. Возможно, имеет смысл просто иметь кнопку, которая открывает папку в вашем приложении, а не создавать новое устройство. Лично мне было бы трудно продолжать использовать приложение, которое делает такую ​​вещь. Это не совсем подходит для остальных доступных приложений.

Вы также можете использовать псевдоним, чтобы указать на каталог данных приложения.

1 голос
/ 27 ноября 2008

Могу ли я предложить переосмыслить это целиком? Символьная ссылка или псевдоним будет работать, но, если возможно, лучшей идеей будет зарегистрироваться для типов файлов, которые люди будут перемещать в эту папку, а затем отреагировать на их открытие, переместив или скопировав их в нужную папку. Я имею в виду что-то вроде интерфейса Dashboard, где, если вы дважды щелкнете по загруженному файлу .wdgt, он спросит, хотите ли вы «установить» виджет, а затем скопируете его в ~ / Library / Widgets. Очевидно, что если вы имеете дело с общими типами, такими как изображения, папки или общие текстовые файлы, это может быть нецелесообразно.

Для реализации нужно просто добавить типы документов в ваш Info.plist и обработать их в приложении-делегате -application: openFile: метод.

1 голос
/ 27 ноября 2008

Вы можете использовать редкий образ диска для создания «поддельного» диска.

Но почему бы не сделать каталог данных настраиваемым в вашем приложении? Или используйте подкаталог в ~/Documents/?

Псевдоним / символическая ссылка на рабочем столе будет самым простым решением:

ln -s '~/Application Data/Yourapp' '~/Desktop/Yourapp Data'
0 голосов
/ 02 сентября 2015

Я делаю это с помощью NSWorkspace. В моем случае я делаю начальную проверку с помощью функции - (BOOL) isMountingPath;

Код для монтажа:

    NSURL *path=[NSURL URLWithString:@"smb://server.resource/KEYS_DB"];
    if(NO==[self isMountedPath:[path absoluteString]])
    {
        NSWorkspace *ws=[NSWorkspace sharedWorkspace];
        [ws openURL:path];
    }

Код для проверки, смонтирован ли путь:

-(BOOL)isMountedPath:(NSString *)share
{
    NSArray * keys = @[NSURLVolumeURLForRemountingKey];
    NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0];

    NSError * error;
    NSURL * remount;

    for (NSURL * mountPath in mountPaths) {
        [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error];
        if(remount){
            if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]])
            {
                printf("Already mounted at %s\n", [[mountPath path] UTF8String]);
                return YES;
            }
        }
    }
    return NO;
}

Другой возможный полезный метод:

-(NSString *)mountedPath:(NSString *)share
{
    NSArray * keys = @[NSURLVolumeURLForRemountingKey];
    NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0];

    NSError * error;
    NSURL * remount;

    for (NSURL * mountPath in mountPaths) {
        [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error];
        if(remount){
            if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]])
            {
                printf("Already mounted at %s\n", [[mountPath path] UTF8String]);
                return [mountPath path];
            }
        }
    }
    return nil;
}
0 голосов
/ 27 ноября 2008

Я также призываю к осторожности, что может показаться большинству пользователей несколько запутанным. Тем не менее, вы рассматривали просто создание программной ссылки на рассматриваемый каталог?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...