2010-07-14 10 views
5

Quiero identificar el archivo y la carpeta con algún color (imagen), alguna idea de cómo se puede lograr He intentado con el servicio de iconos, funciona para archivos pero no funciona con carpetas .Cómo identificar el archivo y la carpeta usando cocoa

Vi este comportamiento trabajando Dropbox (10.4, 10.5 y 10.6) - ¿alguna idea de cómo se puede hacer esto?

Lo siguiente fue muy cercano para mí, pero no está funcionando como se esperaba. http://www.cimgf.com/2008/06/16/cocoa-tutorial-custom-folder-icons/

¿Hay alguna otra solución que no sea el servicio de iconos?

Agradezco cualquier tipo de ayuda.

+0

Obtuve la solución: agregue una bifurcación de recursos para el icono de identificación en una carpeta y cárguela como una insignia para el icono de la carpeta. Nota: el nombre de la ruta del recurso debería finalizar con '\ r' –

+1

¿te importaría agregar una respuesta y mostrar lo que hiciste? Me interesaría ver. ¡Gracias! –

+0

@Dave DeLong Por favor, encuentre mi solución a continuación, Pase la ruta de acceso de la carpeta que desea identificar y NSData del icono de credencialización. El código solo funcionará en intel si desea que esto funcione en PPC, reemplace el uso 'NSUTF16LittleEndianStringEncoding' con respecto a PPC. Espero que le resulte útil este código. –

Respuesta

4

La siguiente función es la solución que encontré para el problema

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

Hola Girish, estoy tratando de marcar carpetas en el buscador con una insignia de icono de accesorio, pero sin éxito hasta el momento. Intenté este código, pero el resultado fue un archivo llamado 'Icono' en la carpeta. ¿Alguna idea de lo que podría estar haciendo mal? ¡Gracias! –

+0

@Joe Ricioppo: bifurcación de recurso de archivo de icono creada como parte de la carpeta de credencialización. –

+0

@JoeRicioppo También estoy enfrentando el mismo problema. El código se ejecuta sin ningún error pero no sucede nada. ¿Cómo resolviste el problema? –

0

Puede hacerlo utilizando el método -setIcon:forFile:options: en NSWorkspace, que le permite especificar un NSImage para aplicar al archivo/carpeta en la ruta que le proporcione.

+0

¿Funciona esto para mac HD y otros volúmenes? –

+0

No, no funcionará para HD y otros volúmenes. –

Cuestiones relacionadas