Listing CleanUpYourFolders.c
/*****************************************************
* CleanUpFolders
*
* A little app to clean up all folders' windows
* starting with the one that this app is in and
* continuing recursively downwards.
*
* Mike Scanlin 17 Oct 1992
****************************************************/
#define kFolderBit (1 << 4)
#define kZoomBit 0x0020
#define kOpenTriangleBit 0x0010
#define kViewMask 0xFF00
#define kViewByName 0x0200
void main(void);
void CleanUpAFolder(long theDrDirID);
void EnumerateCatalog(long dirID);
CInfoPBRec theCPB;
Str255 theName;
Rect theRect;
short hOffset, vOffset;
/*****************************************************
* main
*
* Clean up the directory that this app is residing
* in and then all of the directories contained within
* this directory recursively. Put this app in the
* root directory of a volume and launch it to clean
* up the entire volume.
****************************************************/
void main()
{
long dirID;
short vRefNum;
/* Set the initial directory's size and position */
SetRect(&theRect, 2, 40, 2+228, 40+165);
/* Set the offset for each child directory */
hOffset = 16;
vOffset = 16;
/* Find out where this app is located */
HGetVol(&theName, &vRefNum, &dirID);
theCPB.dirInfo.ioVRefNum = vRefNum;
theCPB.dirInfo.ioNamePtr = theName;
/* First, clean up the current directory */
theCPB.hFileInfo.ioFDirIndex = -1;
theCPB.dirInfo.ioDrDirID = dirID;
PBGetCatInfo(&theCPB, FALSE);
CleanUpAFolder(theCPB.dirInfo.ioDrParID);
/* Now clean up all child directories */
EnumerateCatalog(dirID);
}
/*****************************************************
* CleanUpAFolder
*
* Given a directory ID, this will unzoom the
* window, size and position the window, close the
* "triangle" and set the view to View by Name.
****************************************************/
void CleanUpAFolder(long theDrDirID)
{
theCPB.dirInfo.ioDrDirID = theDrDirID;
theCPB.dirInfo.ioDrUsrWds.frRect = theRect;
/* clear the zoomed bit, the "open triangle bit
* and the view; leave the other bits alone
* because we don't know what they're for.
*/
theCPB.dirInfo.ioDrUsrWds.frView &=
~kViewMask - kZoomBit - kOpenTriangleBit;
/* set the view to View by Name */
theCPB.dirInfo.ioDrUsrWds.frView |= kViewByName;
PBSetCatInfo(&theCPB, FALSE);
}
/*****************************************************
* EnumerateCatalog
*
* Given a directory ID to start with, this calls
* CleanUpAFolder once for every directory within
* the given start directory. On entry it offsets
* theRect down and to the right; on exit it offsets
* it up and to the left.
****************************************************/
void EnumerateCatalog(long dirID)
{
long tempDir;
short index;
OSErr myErr;
OffsetRect(&theRect, hOffset, vOffset);
index = 1;
do {
theCPB.hFileInfo.ioFDirIndex = index;
theCPB.dirInfo.ioDrDirID = dirID;
myErr = PBGetCatInfo(&theCPB, FALSE);
if (myErr == noErr) {
if (theCPB.hFileInfo.ioFlAttrib & kFolderBit) {
tempDir = theCPB.dirInfo.ioDrDirID;
CleanUpAFolder(dirID);
EnumerateCatalog(tempDir);
myErr = noErr;
}
}
index++;
} while (myErr == noErr);
OffsetRect(&theRect, -hOffset, -vOffset);
}