2010-07-14 6 views
5

Ich möchte Datei und Ordner mit etwas Farbe (Bild), jede Idee, wie es erreicht werden kann Ich versuchte mit Icon-Service, es funktioniert für Dateien, aber es funktioniert nicht mit Ordnern .Wie Datei und Ordner mit Kakao Abzeichen

Ich sah dieses Verhalten funktioniert Dropbox (10.4, 10.5 und 10.6) - eine Idee, wie kann dies getan werden?

Das Folgende war sehr nah für mich, aber es funktioniert nicht wie erwartet. http://www.cimgf.com/2008/06/16/cocoa-tutorial-custom-folder-icons/

Gibt es eine andere Lösung als Symboldienst?

Ich schätze jede Art von Hilfe.

+0

Ich habe die Lösung: Fügen Sie eine Ressource Gabel für das Badging-Symbol in einem Ordner und laden Sie diese als ein Abzeichen für das Ordnersymbol. Hinweis: Ressource Gabelname sollte Ende mit '\ r' sein –

+1

Würden Sie etwas dagegen tun, eine Antwort hinzuzufügen und zu zeigen, was Sie getan haben? Ich wäre interessiert zu sehen. Vielen Dank! –

+0

@Dave DeLong Bitte finden Sie meine Lösung geben Sie unten, Pass-Ordner Pfad, den Sie Abzeichen und NSData von Badging-Symbol wollen. Der Code funktioniert nur in Intel, wenn dies in PPC funktioniert, ersetzen Sie die Verwendung 'NSUTF16LittleEndianStringEncoding' in Bezug auf PPC. Hoffe, dass Sie diesen Code nützlich finden. –

Antwort

4

Die folgende Funktion ist die Lösung, die ich für das Problem ist

BOOL AddBadgeToItem(NSString* path,NSData* tag) 

{ 
    FSCatalogInfo info; 
    FSRef par; 
    FSRef ref; 
    Boolean dir = false; 

    if (tag&&(FSPathMakeRef([path fileSystemRepresentation],&par,&dir)==noErr)) 
    { 
     HFSUniStr255 fork = {0,{0}}; 
     sint16 refnum = kResFileNotOpened; 
     FSGetResourceForkName(&fork); 

     if (dir) 
     { 

      NSString *name = @"Icon\r"; 
      memset(&info,0,sizeof(info)); 
      ((FileInfo*)(&info.finderInfo))->finderFlags = kIsInvisible; 

      OSErr error = FSCreateResourceFile(&par,[name lengthOfBytesUsingEncoding:NSUTF16LittleEndianStringEncoding],(UniChar*)[name cStringUsingEncoding:NSUTF16LittleEndianStringEncoding],kFSCatInfoFinderXInfo,&info,fork.length, fork.unicode,&ref,NULL); 

      if(error == dupFNErr) 
      { 
       // file already exists; prepare to try to open it 
       const char *iconFileSystemPath = [[path stringByAppendingPathComponent:@"\000I\000c\000o\000n\000\r"] fileSystemRepresentation]; 

       OSStatus status = FSPathMakeRef((const UInt8 *)iconFileSystemPath, &ref, NULL); 
       if (status != noErr) 
       { 
        fprintf(stderr, "error: FSPathMakeRef() returned %d for file \"%s\"\n", (int)status, iconFileSystemPath); 

       } 
      }else if (error != noErr) 
      { 
       return NO; 
      } 

     } 
     else 
     { 
      BlockMoveData(&par,&ref,sizeof(FSRef)); 
      if (FSCreateResourceFork(&ref,fork.length,fork.unicode,0)!=noErr) 
      { 
       //test 

       if (FSOpenResourceFile(&ref,fork.length,fork.unicode,fsRdWrPerm,&refnum)!=noErr) { 
        return NO; 
       } 
       if (refnum!=kResFileNotOpened) { 

        UpdateResFile(refnum); 
        CloseResFile(refnum); 

        if (FSGetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info,NULL,NULL,NULL)==noErr) { 
         ((ExtendedFileInfo*)(&info.extFinderInfo))->extendedFinderFlags = kExtendedFlagsAreInvalid; 
         FSSetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info); 
        } 
       } 

       //Test end 
       return NO; 
      } 
     } 
     OSErr errorr = FSOpenResourceFile(&ref,fork.length,fork.unicode,fsRdWrPerm,&refnum); 
     if (errorr!=noErr) { 
      return NO; 
     } 
     if (refnum!=kResFileNotOpened) { 
      CustomBadgeResource* cbr; 

      int len = [tag length]; 
      Handle h = NewHandle(len); 
      if (h) { 
       BlockMoveData([tag bytes],*h,len); 
       AddResource(h,kIconFamilyType,128,"\p"); 
       WriteResource(h); 
       ReleaseResource(h); 
      } 

      h = NewHandle(sizeof(CustomBadgeResource)); 
      if (h) { 
       cbr = (CustomBadgeResource*)*h; 
       memset(cbr,0,sizeof(CustomBadgeResource)); 
       cbr->version = kCustomBadgeResourceVersion; 
       cbr->customBadgeResourceID = 128; 
       AddResource(h,kCustomBadgeResourceType,kCustomBadgeResourceID,"\p"); 
       WriteResource(h); 
       ReleaseResource(h); 
      } 

      UpdateResFile(refnum); 
      CloseResFile(refnum); 

      if (FSGetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info,NULL,NULL,NULL)==noErr) { 
       ((ExtendedFileInfo*)(&info.extFinderInfo))->extendedFinderFlags = kExtendedFlagHasCustomBadge; 
       FSSetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info); 
      } 
     } 
    } 
    return NO; 
} 
+1

Hallo Girish, ich versuche Ordner im Finder mit einem Accessoire-Icon-Badge zu versehen, aber bisher erfolglos. Ich habe diesen Code ausprobiert, aber das Ergebnis war eine Datei namens "Icon" im Ordner. Irgendeine Idee, was ich falsch machen könnte? Vielen Dank! –

+0

@Joe Ricioppo: Symboldatei Ressourcenzweig erstellt als Teil des Badging-Ordners. –

+0

@JoeRicioppo Ich habe auch das gleiche Problem. Der Code läuft ohne Fehler, aber nichts passiert. Wie hast du das Problem gelöst? –

0

Sie können dies mit der Methode -setIcon:forFile:options: auf NSWorkspace tun, mit der Sie einfach einen NSImage angeben können, der auf die Datei/den Ordner angewendet wird.

+0

Funktioniert das für Mac HD und andere Volumes? –

+0

Nein, es funktioniert nicht für HD und andere Volumes. –