2010-07-14 17 views
5

Bazı renk (görüntü) ile dosya ve klasörün rozetini kaldırmak istiyorum, herhangi bir fikir nasıl elde edilebilir Simge servisi ile denedim, dosyalar için çalıştım ancak klasörlerle çalışmıyor .Dosya ve klasör kakao kullanarak nasıl rozetlenir

Bu davranışı çalışırken gördüm Dropbox (10.4, 10.5 ve 10.6) - bu nasıl yapılabilir?

Aşağıdakiler benim için çok yakındı, ancak beklendiği gibi çalışmıyor. http://www.cimgf.com/2008/06/16/cocoa-tutorial-custom-folder-icons/

Simge servisi dışında başka bir çözüm var mı?

Her türlü yardımı takdir ediyorum.

+0

Çözümü aldım: Bir klasördeki rozet simgesi için kaynak çatalı ekleyin ve bunu klasör simgesi için bir rozet olarak yükleyin. Not: kaynak çatalı adı '\ r' –

+1

ile bitmeli ve bir cevap ekleyip ne yaptığınızı gösterir misiniz? Görmek isterdim. Teşekkürler! –

+0

@Dave DeLong Lütfen benim çözümümüzü verin, yakala klasörünü Yakalamak istediğiniz yolu ve rozetden NSData'yı işaretleyin. Kod, yalnızca PPC'de çalışmasını istiyorsanız, 'NSUTF16LittleEndianStringEncoding' kullanımını PPC'ye göre değiştirir. Bu kodu yararlı bulmanızı dilerim. –

cevap

4

İzleyen fonksiyon, bir sorun

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

Merhaba Girish, Bulucudaki bir aksesuar simgesi rozeti olan klasörleri işaretlemeye çalışıyorum, ancak şu ana kadar başarısız bir şekilde. Bu kodu denedim, ancak sonuç klasördeki 'Icon' adlı bir dosyaydı. Neyi yanlış yaptığımı biliyor musun? Teşekkürler! –

+0

@Joe Ricioppo: simge dosyası kaynak çatalı, badging klasörünün bir parçası olarak oluşturuldu. –

+0

@JoeRicioppo Aynı konuyla da ilgileniyorum. Kod hatasız çalışır, ancak hiçbir şey olmaz. Sorunu nasıl çözdünüz? –

0

Bunu, NSWorkspace üzerinde -setIcon:forFile:options: yöntemini kullanarak yapabilirsiniz, bu da verdiğiniz yoldaki dosya/klasöre uygulamak için bir NSImage belirtmenize izin verir.

+0

Bu, Mac HD ve diğer birimler için çalışıyor mu? –

+0

Hayır, HD ve diğer birimler için çalışmayacaktır. –

İlgili konular