[Pythonmac-SIG] Creating resource files

Michael Hudson mwh@python.net
Wed, 19 Mar 2003 10:55:37 +0000

Jack Jansen <Jack.Jansen@oratrix.com> writes:

> On dinsdag, maa 18, 2003, at 15:45 Europe/Amsterdam, Michael Hudson
> wrote:
>> So, I have a path, a creator code and a type code.  I want to create a
>> file with a resource fork.  This is the code I have now:
>>                 # this cannot possibly be the easiest way of doing
>> this.
>>                 dir = os.path.dirname(path)
>>                 if not dir:
>>                     dir = os.curdir
>>                 volID = File.FSSpec(dir).as_tuple()[0]
>>                 dirRef = File.FSRef(dir)
>>                 ci = dirRef.FSGetCatalogInfo(Files.kFSCatInfoNodeID)
>>                 dirID = ci[0].nodeID
>>                 newSpec = File.FSSpec((volID, dirID,
>>                                        os.path.basename(path)))
> Everything up to here can be done as
>                   newSpec = File.FSSpec(path)

That would be nice, if true:

->> File.FSSpec("/not-there")
Traceback (most recent call last):
  File "<input>", line 2, in ?
Error: (-43, 'File not found')

Should I update again?  AIUI, File.FSSpec(path) goes through creating
a FSRef, and you can't have a FSRef to a file that doesn't exist (it
seems, anyway).

>>                 newSpec.FSpCreate(CREATOR, TYPE, 0)
>>                 Res.FSpCreateResFile(path, CREATOR, TYPE, 0)
> As to the FSRef calls: setting creator/type indeed seems to be
> difficult with these. I think it can (in C) be done with
> FSSetCatalogInfo, but I'm not sure whether all the needed bits are
> exported to Python (I did a quick and dirty implementation of
> FS{Get,Set}CatalogInfo only a couple of weeks ago). If there are bits
> missing please let me know.

It wasn't obvious to me how to use FSSetCatalogInfo to set creator and
file type in C...

> Hmm, you could use the FSRef calls to create the resource file,
> something like (off the top of my head)
> 	dstdir, filename = os.path.split(path)
> 	fsr, fss = Res.CreateResourceFile(dstdir, unicode(filename,
> 	'utf8'), File.FSGetResourceForkName())
> 	MacOS.SetCreatorAndType(fsr, CREATOR, TYPE)

->> Res.CreateResourceFile
Traceback (most recent call last):
  File "<input>", line 2, in ?
AttributeError: 'module' object has no attribute 'CreateResourceFile'

Hmm, Res.FSCreateResFile looks hopeful...

> Pathnames, FSSpecs and FSRefs can be used interchangeably almost
> everywhere. the only reason for the unicode(filename, 'utf8') is that
> if you pass a string where the PyArg_Parse format expects a unicode it
> will just pas the raw data. Very handy for writing unicode data to
> files, very stupid for places where the unicode is actually
> interpreted (like filenames).

Yeah, I knew about these issues...

Thanks for the help!


  For every complex problem, there is a solution that is simple,
  neat, and wrong.                                    -- H. L. Mencken