Насколько я знаю, скрытые файлы в OS X определяются либо именем файла с префиксом точки, либо специальным битом "невидимка", который отслеживается Finder.
Несколько лет назад мне пришлось написать что-то, что переключало видимость данного файла, и я обнаружил, что это на самом деле намного сложнее, чем я ожидал. Суть его в том, чтобы получить запись Finder info (FInfo
) для файла и проверить, был ли установлен бит kIsInvisible
. Вот метод, который я написал для переключения видимости файла - я думаю, что многое из этого имеет отношение к вашей задаче, хотя вам, очевидно, придется немного его настроить.
- (BOOL)toggleVisibilityForFile:(NSString *)filename isDirectory:(BOOL)isDirectory
{
// Convert the pathname to HFS+
FSRef fsRef;
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filename, kCFURLPOSIXPathStyle, isDirectory);
if (!url)
{
NSLog(@"Error creating CFURL for %@.", filename);
return NO;
}
if (!CFURLGetFSRef(url, &fsRef))
{
NSLog(@"Error creating FSRef for %@.", filename);
CFRelease(url);
return NO;
}
CFRelease(url);
// Get the file's catalog info
FSCatalogInfo *catalogInfo = (FSCatalogInfo *)malloc(sizeof(FSCatalogInfo));
OSErr err = FSGetCatalogInfo(&fsRef, kFSCatInfoFinderInfo, catalogInfo, NULL, NULL, NULL);
if (err != noErr)
{
NSLog(@"Error getting catalog info for %@. The error returned was: %d", filename, err);
free(catalogInfo);
return NO;
}
// Extract the Finder info from the FSRef's catalog info
FInfo *info = (FInfo *)(&catalogInfo->finderInfo[0]);
// Toggle the invisibility flag
if (info->fdFlags & kIsInvisible)
info->fdFlags &= ~kIsInvisible;
else
info->fdFlags |= kIsInvisible;
// Update the file's visibility
err = FSSetCatalogInfo(&fsRef, kFSCatInfoFinderInfo, catalogInfo);
if (err != noErr)
{
NSLog(@"Error setting visibility bit for %@. The error returned was: %d", filename, err);
free(catalogInfo);
return NO;
}
free(catalogInfo);
return YES;
}
Вот документация Apple по Finder Interface , если вам нужна дополнительная информация. Надеюсь, это поможет.