Обновите значки для файлов или папок в Finder с помощью какао

Я разрабатываю приложение какао для Mac. Я накладываю значки наложения на файлы и папки с помощью своего приложения. Но моя проблема в том, что когда я меняю значок для файла или папки из своего приложения, он не отражает его в Finder, если я не нажимаю на какой-либо файл или папку в Finder. Для обновления Finder я запускаю следующий applescript, используя следующий код из моего приложения:

NSString *source=[NSString stringWithFormat:@"tell application \"Finder\" to update POSIX file \"%@\"",itemPath];
NSAppleScript *run = [[NSAppleScript alloc] initWithSource:source];
[run executeAndReturnError:nil];

Но этот код не обновляет мой Finder. Есть идеи, как обновить Finder, чтобы сразу отобразить значок для файла или папки ??? Заранее спасибо...


person Amrinder Singh    schedule 18.05.2012    source источник
comment
@Amirinder Singh нашли ли вы какое-нибудь решение, чтобы преодолеть эту проблему?   -  person jigs    schedule 13.07.2015
comment
@jigs на самом деле я завершил этот проект и решил эту проблему. Но теперь у меня с собой нет исходного кода, поэтому не помню, какое было разрешение.   -  person Amrinder Singh    schedule 20.08.2015


Ответы (4)


Вы должны указать класс (папка, файл, диск, элемент, ...), когда вы используете строку в Finder, элемент будет работать для всех (папка, файл, ...).

Без него это работает для некоторых, но не для всех

Кроме того, "posix файл thePath" в Finder более надежен со скобками.

Попробуй это

NSString *source=[NSString stringWithFormat:@"tell application \"Finder\" to update item (POSIX file \"%@\")",itemPath];

Или без NSApplescript:

[[NSWorkspace sharedWorkspace] noteFileSystemChanged: itemPath];
person jackjr300    schedule 18.05.2012
comment
Спасибо за ответ. Я попытался вставить круглые скобки в соответствии с вашим предложением, но это не сработало. Иконки не отражаются до тех пор, пока пользователь не щелкнет окно Finder. - person Amrinder Singh; 22.05.2012
comment
Попробуйте noteFileSystemChanged: - ›[[NSWorkspace sharedWorkspace] noteFileSystemChanged: itemPath]; - person jackjr300; 25.05.2012
comment
Я проверяю оба варианта, но у меня они не работают :( - person jigs; 13.07.2015

@"tell application \"Finder\" to update POSIX file \"%@\"" этот сценарий у меня работает нормально.
Вы также можете использовать события Apple.
Код ниже написан JWWalker

OSStatus    SendFinderSyncEvent( const FSRef* inObjectRef )
{
    AppleEvent  theEvent = { typeNull, NULL };
    AppleEvent  replyEvent = { typeNull, NULL };
    AliasHandle itemAlias = NULL;
    const OSType    kFinderSig = 'MACS';

OSStatus    err = FSNewAliasMinimal( inObjectRef, &itemAlias );
if (err == noErr)
{
    err = AEBuildAppleEvent( kAEFinderSuite, kAESync, typeApplSignature,
        &kFinderSig, sizeof(OSType), kAutoGenerateReturnID,
        kAnyTransactionID, &theEvent, NULL, "'----':alis(@@)", itemAlias );

    if (err == noErr)
    {
        err = AESendMessage( &theEvent, &replyEvent, kAENoReply,
            kAEDefaultTimeout );

        AEDisposeDesc( &replyEvent );
        AEDisposeDesc( &theEvent );
    }

    DisposeHandle( (Handle)itemAlias );
}

    return err;
}
person Parag Bafna    schedule 18.05.2012
comment
Спасибо за ваш ответ. Я скопировал предоставленный вами код в код моего приложения, но он выдает ошибки для kAEFinderSuite. Не могли бы вы предоставить мне необходимый исходный код, чтобы использовать это в моем приложении, а также как вызвать эту функцию в моем приложении. - person Amrinder Singh; 22.05.2012

Вот как я «обновляю Finder», когда это необходимо. Может вам это поможет;)

tell application "Finder"
    tell window 1 to update items
end tell
person regulus6633    schedule 18.05.2012
comment
Спасибо за ваш ответ. Не могли бы вы предоставить мне исходный код для запуска этого сценария с помощью моего приложения? - person Amrinder Singh; 22.05.2012
comment
Просто измените первую строку исходного кода на ... NSString * source = @tell application \ Finder \, чтобы указать окну 1 обновить элементы. - person regulus6633; 22.05.2012

Что сработало для меня, так это «прикоснуться» к файлу, который обновит дату изменения файла и, таким образом, запустит обновление значка эскиза в Finder.

NSString* path = "/Users/xx/...path_to_file"
NSString* command = [NSString stringWithFormat:@"touch \"%@\"", path];
int res = system(command.UTF8String);
person mixtly87    schedule 08.08.2019