On Mar 20, 2006, at 6:02 PM, Jeffrey Ellis wrote:
As far as the other issue, I'll post it again. Does anyone know how
to not
have filenames truncated to 32 characters under OS X?
The problem with seeing the truncated file names comes from how OS X
presents the absolutePath string. However, if you use just the name
property it will always show the proper file name. To get around the
problem presented by using the AbsolutePath property of the
folderitem I wrote the following functions as an extensions to the
FolderItem class. Because they are extensions they must reside within
a module so that they can be accessed globally. It's going to seem
like a lot of code, but it executes with good speed and I use it all
the time.
Function getPathForDisplay(Extends f As FolderItem) As String
// This method walks up the hierarchy of the folderitem passed to it
// to form its own version of the absolutepath string, being able to
// handle level names longer than 31 characters.
Dim parts(-1), goodPath As String
Dim fp As FolderItem
parts.Insert 0, f.name // get the file/folder name
fp = f
Do
fp = fp.Parent // go up one level in the hierarchy
parts.insert 0, fp.name // insert folder/volume name for this
level
Loop Until fp.parent = nil // if at the volume level we end the loop
goodPath = Join(parts,":") // join the parts to make the new path
string
// if this is a directory, and not a bundle add colon to end of
string, its a folder
if f.Directory and not f.isBundle then goodPath = goodPath + ":"
return goodPath
End Function
Now when you want an AbsolutePath that shows the file name, or
intervening folder name, that is longer than 31 characters just use a
statement like the following:
myAbsolutePath = f.getPathForDisplay
where you have dimmed myAbsolutePath as a string. The contents of
myAbsolutePath will have all the proper names in the result.
You will notice the next to the last line above:
if f.Directory and not f.isBundle then goodPath = goodPath + ":"
uses another function to determine if the file being looked at is a
bundle or not: the code for that method is (watch out for line
wrapping). However, if you don't care whether or not the path name
ends with a colon when the item is a folder, you can remove that line
and ignore the function that follows.
Function isBundle(Extends f As FolderItem) As Boolean
// this method, which was gotten from one of the RB mailing lists
and was written by someone much more
// knowledgable than myself, returns True if the passed in
folderitem points to a bundle file and false if it
// does not
dim parentSpec as MemoryBlock
dim parentRef as MemoryBlock
dim fsRef as MemoryBlock
dim fileName as String
dim OSError as Integer
dim itemInfo as MemoryBlock
dim itemFlags as Integer
Const kLSRequestBasicFlagsOnly = &h00000004
Const kLSItemInfoIsPackage = &h00000002
Declare Function FSMakeFSSpec Lib "CarbonLib" (vRefNum as Short,
dirID as Integer, fileName as PString, spec as Ptr) As Short
Declare Function FSpMakeFSRef Lib "CarbonLib" (source as Ptr,
newRef as Ptr) as Short
Declare Function FSMakeFSRefUnicode Lib "CarbonLib" (parentPtr as
Ptr, nameLength as Integer, name as CString, enc as Integer, outRef
as Ptr) as Short
Declare Function LSCopyItemInfoForRef Lib "CarbonLib" (inItemRef
as Ptr, inWhichInfo as Integer, outItemInfo as Ptr) as Integer
If f.Parent <> nil then //top-level directories probably aren't
bundles
parentSpec = NewMemoryBlock(70)
OSError = FSMakeFSSpec(f.MacVRefNum, f.MacDirID, "", parentSpec)
If OSError <> 0 then
Raise new MacToolboxException("FSMakeFSSpec returned error " +
Str(OSError))
End if
parentRef = NewMemoryBlock(80)
OSError = FSpMakeFSRef(parentSpec, parentRef)
If OSError <> 0 then
Raise new MacToolboxException("FSpMakeFSRef returned error " +
Str(OSError))
End if
fileName = ConvertEncoding(f.name, Encodings.UTF16)
fsRef = NewMemoryBlock(80)
OSError = FSMakeFSRefUnicode(parentRef, Len(fileName), fileName,
0, fsRef)
If OSError <> 0 then
Raise new MacToolboxException("FSMakeFSRefUnicode returned
error " + Str(OSError))
End if
itemInfo = NewMemoryBlock(24)
OSError = LSCopyItemInfoForRef(fsRef, kLSRequestBasicFlagsOnly,
itemInfo)
If OSError <> 0 then
Raise new MacToolboxException("LSCopyItemInfoForRef returned
error " + Str(OSError))
End if
itemFlags = itemInfo.Long(0)
Return Bitwise.BitAnd(itemFlags, kLSItemInfoIsPackage) =
kLSItemInfoIsPackage
Else
Return false
End if
End Function
=== A Mac addict in Tennessee ===
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>