I’m trying to retrieve files/folders icons that the user may have changed (not interested in the default icon for the file’s type, but only if the user has altered it, like pasting on Mac), save them and later restore them. For Mac, Windows and Linux (otherwise, it’s no fun trying hard things )
To gather the icon, I’m using various functions in the MBS plugin (I have yet to test my method). How would I go about restoring (setting) them later?
[quote=472023:@Emile Schwarz]The icons are stored in .DS_Store (check spelling), an invisible file for items.
For folders, the icon is stored in an Icon + Return file inside the directory (once more an invisible file).[/quote]
Thanks for your reply.
OK, for folders, I already knew the file. That’s not a problem, as I can store the icon file as well. (BTW: wondering what happens if the user edits that icon file and, for example, put Hello world instead; I’ll try )
For files, .DS_Store isn’t the right answer. That one stores Finder’s views of the containing folder (e.g. if you choose to sort by name or show extra information). You can hardly store the icon of all files in a given folder inside a single file.
It used to be stored in the resources fork. Now, I guess there’s another location to get/set it, I just don’t know which.
[quote=472027:@Emile Schwarz]Thumbs.db holds the images icons preview (as jpg) for images, I do not know for folders(also invisible file).
That file is not mandatory, it is created when the folder is viewed as Icons AND some images exists in that folder.[/quote]
That one still doesn’t suit my needs, sorry. If I create a picture file, I know Windows would create the thumbnail automatically; If I create another kind of file, the Thumbs.db file isn’t to be modified. In both cases, dealing with this file is probably not a good thing.
Sorry, I don’t quite understand this statement What do you mean by holding MacOS?
You’re talking about the catalog of the file system? That’s possible, as I guess a custom icon isn’t stored in the file itself (otherwise, I couldn’t have a 0 byte file with a custom icon; and I actually can). Still, how to set it?
Right. In Mac OS 9 (and earlier), there were the Desktop DB and Desktop DF files; those could be rebuilt (using option+command keys at the end of the start up process, IIRC). Unless I’m mistaken, they didn’t contain file icons, but your choices to open files with other applications and other desktop services information. I don’t think they contained file icons, otherwise those files would have been way bigger (and searching inside a single file for a particular file’s icon would have been a pain for the OS, anyway).
Mac OS X doesn’t use those files anymore. .DS_store files provide a subset of these ones, I believe.
I couldn’t agree more. If changes could be made only because technology progresses (and not because an OS maker just decides to remove a feature because he doesn’t like that feature himself ), we would not have to learn a ton of new things for the sake of change.
Only when the holding folder is opened. If you create a folder on Windows (and do not open it), store some images there, archive it in a zip file, there will never be a Thumbs.db file.
A folder holding files that is compacted (zip for example) and opened on Windows 10 will have a special file whose name contains MacOS (something like that) in it.
[quote=472041:@Sam Rowlands]NSWorkspace iconForFile: Will get the file icon.
NSWorkspace setIcon:forFile:options will set the icon.
Great! Actually, I’m using NSWorkspace to get the icon since I moved to Mojave (around 7 months ago), so I knew for the get part. I didn’t ever noticed there was a set icon alongside Granted, it’s even in the MBS plugin (which is the way I get the icon)
In the file/folder flags (e.g. with GetFileFlagsMBS), one flag is HasCustomIcon. This flag already existed in MacOS 9 (recall using ResEdit to see them ) but is still used now (at least, it was when I last checked, some months ago).
This flag, once you paste an icon in the Finder’s information dialog, is set to true (to false when you delete the custom icon). If the file has a custom icon but you remove the flag, it shows the default icon (I experimented this years ago, I guess it’s still true). If you set the flag while the file has never had a pasted, custom icon, the file stays with the default icon (under some circumstances, I’ve seen the icon showing another one, like a stationary icon).
I’m not sure, since I know the NSWorkspace set method only from now, whether I have to also set the HasCustomIcon flag after calling the NSWorkspace method or if it does it automatically. I’ll see, obviously.
Good point.
Anyway, I’m not dealing with previews of picture files in my app, but good to know.
Ah, you’re referring to the resource and metadata files (for a test.jpg file having resources or otherwise unknown properties to other operating systems, you get a ._test.jpg file along the original file (actually, Mac OS would strongly hide those files, even if you bring them back from a volume whose the format doesn’t support resources)).
Those files usually don’t contain a preview of the original file, but, rather, the resource fork (or other alternate forks, as you may have 50 forks for a given file if you want) and things like the Finder’s label value or concepts foreign to other systems. Granted, one of those alternate forks may contain a preview, but it’s far from a rule.
When you use setIcon method in NSWorkspaceMBS class, the file gets a resource fork with a icns resource.
GetFileFlagsMBS function then reports 1024 for the file with custom icon and 0 for a file without custom icon. Please use Bitwise.BitAnd to check for the bit as others may be set.
Same information can also be seen via FileListMBS.FinderFlags or using MDItemMBS with kMDItemFSHasCustomIcon constant.
You can use ResourceForkMBS class to inspect (even in 64-bit with recent plugins!)