1

我正在为 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 以立即反映文件或文件夹的图标吗???提前致谢...

4

4 回答 4

2

当您在 Finder 中使用字符串时,您必须指定类(文件夹、文件、磁盘、项目...),项目将适用于所有(文件夹、文件、...)。

没有它,它适用于某些人,但并非适用于所有人

此外,Finder 中的“ posix file thePath ”使用括号更可靠。

尝试这个

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

或者没有NSApplescript

[[NSWorkspace sharedWorkspace] noteFileSystemChanged: itemPath];
于 2012-05-18T21:05:59.300 回答
0

@"tell application \"Finder\" to update POSIX file \"%@\""这个脚本对我来说很好。
您还可以使用苹果事件。
以下代码由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;
}
于 2012-05-18T18:59:30.280 回答
0

这是我在需要时“刷新 Finder”的方法。也许它会帮助你;)

tell application "Finder"
    tell window 1 to update items
end tell
于 2012-05-18T22:55:12.857 回答
0

对我有用的是“触摸”更新文件修改日期的文件,从而触发 Finder 刷新缩略图图标。

NSString* path = "/Users/xx/...path_to_file"
NSString* command = [NSString stringWithFormat:@"touch \"%@\"", path];
int res = system(command.UTF8String);
于 2019-08-08T11:03:21.243 回答