2010-07-14 20 views
5

का उपयोग करके फ़ाइल और फ़ोल्डर को बैज कैसे करें मैं कुछ रंग (छवि) के साथ फ़ाइल और फ़ोल्डर को बैज करना चाहता हूं, किसी भी विचार को यह कैसे प्राप्त किया जा सकता है मैंने आइकन सेवा के साथ प्रयास किया, यह फाइलों के लिए काम करता है लेकिन यह फ़ोल्डर के साथ काम नहीं कर रहा है ।कोको

मैंने देखा कि यह व्यवहार Dropbox (10.4, 10.5 और 10.6) काम कर रहा है - कोई विचार यह कैसे किया जा सकता है?

निम्नलिखित मेरे लिए बहुत करीब था, लेकिन यह उम्मीद के अनुसार काम नहीं कर रहा है। http://www.cimgf.com/2008/06/16/cocoa-tutorial-custom-folder-icons/

क्या कोई अन्य समाधान है तो आइकन सेवा?

मैं किसी भी प्रकार की सहायता की सराहना करता हूं।

+0

मुझे समाधान मिला: फ़ोल्डर में बैजिंग आइकन के लिए संसाधन कांटा जोड़ें और फ़ोल्डर आइकन के लिए बैज के रूप में लोड करें। नोट: संसाधन कांटा नाम '\ r' –

+1

के साथ समाप्त होना चाहिए, क्या आप एक उत्तर जोड़ने और दिखाएंगे कि आपने क्या किया? मुझे देखने में दिलचस्पी होगी। धन्यवाद! –

+0

@ डेव डीलॉन्ग कृपया मेरे समाधान को हल करें, पास करें पथ पथ जिसे आप बैज करना चाहते हैं और बैडिंग आइकन से एनएसडीटा। कोड केवल इंटेल में काम करेगा यदि आप चाहते हैं कि यह पीपीसी में काम कर रहा हो तो पीपीसी के संबंध में 'NSUTF16LittleEndianStringEncoding' का उपयोग करें। आशा है कि आपको यह कोड उपयोगी लगेगा। –

उत्तर

4

निम्नलिखित समारोह समाधान मैं इस समस्या

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

हाय गिरीश, मैं एक सहायक आइकन बैज के साथ खोजक में फ़ोल्डरों को बैज करने का प्रयास कर रहा हूं, लेकिन अब तक असफल रहा है। मैंने इस कोड को आजमाया लेकिन परिणाम फ़ोल्डर में 'आइकन' नाम की एक फ़ाइल थी। कोई विचार क्या मैं गलत कर रहा हूँ? धन्यवाद! –

+0

@ जो Ricioppo: बैजिंग फ़ोल्डर के हिस्से के रूप में बनाया गया आइकन फ़ाइल संसाधन कांटा। –

+0

@ जोरेरिकियोपो मुझे भी एक ही समस्या का सामना करना पड़ रहा है। कोड बिना किसी त्रुटि के चलाता है लेकिन कुछ भी नहीं होता है। आपने समस्या को कैसे हल किया ??? –

0

आप NSWorkspace पर -setIcon:forFile:options: विधि का उपयोग करके ऐसा कर सकते हैं, जो आपको फ़ाइल/फ़ोल्डर पर लागू करने के लिए बस एक एनएसआईमेज निर्दिष्ट करने देता है।

+0

क्या यह मैक एचडी और अन्य वॉल्यूम्स के लिए काम करता है? –

+0

नहीं, यह एचडी और अन्य वॉल्यूम के लिए काम नहीं करेगा। –