pfluegerm@gtephx.UUCP (Mike Pflueger) (06/21/91)
My understanding of the File Manager is a little fuzzy and I'd be
greatful for any help with this problem.
My routine which opens/creates preferences currently only looks in the
system folder, and I'm trying to add code for it to try to use the
Preferences folder as a default (system 7).
The problem is, at the point marked with XXXX below, it doesn't matter
whether an existing file is in the Preferences folder or just in the
System Folder - it opens. When I get to the point marked ZZZZ, the
path (and WD) always indicates that the file is in the preferences
WD, even if it's really in the system folder.
Why is this? I don't need to close the System Folder WD first, do I?
I'm using THINK Pascal.
Some info about my utility routines I call in this example:
MoveToFolder - does a PBSetVol to the specified WD
MoveToSysFolder - does a PBSetVol to the System Folder
GetPath - returns the full path name up to (not including) the file
Thanks in advance
Mike
{**********************************************************}
function OpenPrefsFile (FileName, FileCreator, FileType: str255;
var FullPath: str255; var new: boolean; var FRef: integer): OSErr;
{ First look for the specified preferences file in the preferences folder }
{ which is in the system folder. If there is no preferences folder or the }
{ file doesn't exist, look for the file in the system folder. If not }
{ found there, and "new" is true, create a preferences folder if one does }
{ not exist, then create the file in the preferences folder. Return the }
{ full path name and fref to the open file. }
var
Err: OSErr;
foundWD, SysWD, PrefsWD: integer;
sysDirID: longint;
CIFR: CInfoPBRec;
CIP: CInfoPBPtr;
WDPB: WDPBRec;
PBP: WDPBPtr;
HPB: HParmBlkPtr;
HPBR: HParamBlockRec;
PrefsName: str255;
prefsFldrFound: boolean;
begin
SysWD := MoveToSysFolder; { SetVol to the system folder }
GetIndString(PrefsName, ParamStrings, PrefsFolderName);
CIP := @CIFR;
PBP := @WDPB;
HPB := @HPBR;
{ see if there's a folder called "Preferences" }
with CIP^ do
begin
ioNamePtr := @PrefsName;
ioCompletion := nil;
iovrefNum := SysWD;
ioFDirIndex := 0;
ioDrDirID := 0;
Err := PBGetCatInfo(CIP, false);
sysDirID := ioDirID;
end;
if (Err = noErr) and (BTST(CIP^.ioFlAttrib, 4)) then { bit 4 set if folder }
with PBP^ do
begin { preferences folder exists, open a WD for it }
ioNamePtr := nil;
ioCompletion := nil;
ioVRefNum := SysWD;
ioWDIndex := 0;
ioWDProcID := 0;
ioWDVRefNum := 0;
Err := PBGetWDInfo(PBP, false);
ioNamePtr := nil;
ioCompletion := nil;
ioVRefNum := SysWD;
ioWDProcID := 0;
ioWDDirID := CIP^.ioDrDirID;
Err := PBOpenWD(PBP, false);
MoveToFolder(ioVRefNum);
prefsFldrFound := true;
prefsWD := ioVRefNum;
foundWD := prefsWD;
XXXX Err := FSOpen(FileName, prefsWD, fRef); { try to open prefs file }
end
else
begin { preferences doesn't exist, indicate file not found }
prefsFldrFound := false;
Err := fnfErr;
end;
if Err = fnfErr then { not in system:preferences; try the system folder }
begin
MoveToFolder(SysWD);
foundWD := SysWD;
Err := FSOpen(FileName, SysWD, fRef);
end;
if (Err = fnfErr) and new then
begin { create new file in the preferences folder }
if not prefsFldrFound then
begin
with HPB^ do
begin { create a Preferences folder }
ioCompletion := nil;
ioNamePtr := @PrefsName;
ioVrefNum := SysWD;
ioDirID := sysDirID;
Err := PBDirCreate(HPB, false);
prefsWD := ioWDDirID;
end;
with PBP^ do
begin
ioNamePtr := nil;
ioCompletion := nil;
ioVRefNum := SysWD;
ioWDProcID := 0;
ioWDDirID := HPB^.ioDirID;
Err := PBOpenWD(PBP, false);
end;
end;
MoveToFolder(prefsWD);
Err := Create(FileName, prefsWD, FileCreator, FileType);
foundWD := prefsWD;
Err := FSOpen(FileName, prefsWD, fRef);
{ no previous preferences, set flag indicating we created it }
new := true;
end
else
new := false; { preferences not found and not created }
if Err = noErr then
begin
ZZZZ FullPath := GetPath(foundWD);
if length(FullPath) > maxParamLength then
FullPath := concat(copy(FullPath, 1, maxParamLength), '...');
end
else
begin
FullPath := '';
fref := 0;
end;
OpenPrefsFile := Err;
end;
--
Mike Pflueger @ AG Communication Systems (formerly GTE Comm. Sys.), Phoenix, AZ
UUCP: {...!ames!ncar!noao!asuvax | uunet!hrc | att}!gtephx!pfluegerm
Work: 602-582-7049 FAX: 602-582-7624 Home: 602-439-1978
Packet: WD8KPZ @ KB7TV.AZ.USA.NA Internet: gtephx!pfluegerm@asuvax.eas.asu.edu