📄 filespecutils.cpp
字号:
}
}
} // while (!bDoneWithThisDirectory)
}
}
} // while(!specArray.IsEmpty())
fSize = totalSize;
return HXR_OK;
}
// ------------------------------------------------------------------------------------
//
// GetCurrentApplication
// GetCurrentApplicationDir
//
// ------------------------------------------------------------------------------------
CHXFileSpecifier CHXFileSpecUtils::GetCurrentApplication()
{
OSErr err;
FSSpec appFSSpec;
ProcessSerialNumber appPSN = { 0, kCurrentProcess };
ProcessInfoRec appPIR;
CHXFileSpecifier appSpec;
appPIR.processInfoLength = sizeof(ProcessInfoRec);
appPIR.processAppSpec = &appFSSpec;
appPIR.processName = NULL;
err = GetProcessInformation(&appPSN, &appPIR);
check_noerr(err);
if (err == noErr)
{
appSpec = appFSSpec;
}
return appSpec;
}
CHXDirSpecifier CHXFileSpecUtils::GetCurrentApplicationDir()
{
CHXFileSpecifier appSpec;
CHXDirSpecifier dirSpec;
appSpec = GetCurrentApplication();
if (appSpec.IsSet())
{
dirSpec = appSpec.GetParentDirectory();
}
return dirSpec;
}
// ------------------------------------------------------------------------------------
//
// FileExists
// DirectoryExists
//
// ------------------------------------------------------------------------------------
#ifndef USE_FSREFS
static BOOL FSSpecExists(FSSpecPtr itemSpec, BOOL *isDirectory); // Forward declaration
BOOL CHXFileSpecUtils::FileExists(const CHXFileSpecifier& fileSpec)
{
FSSpec fileFSSpec;
BOOL isDirectory;
require_return(fileSpec.IsSet(), FALSE);
fileFSSpec = fileSpec;
return FSSpecExists(&fileFSSpec, &isDirectory) && !isDirectory;
}
BOOL CHXFileSpecUtils::DirectoryExists(const CHXDirSpecifier& dirSpec)
{
FSSpec dirFSSpec;
BOOL isDirectory;
require_return(dirSpec.IsSet(), FALSE);
dirFSSpec = dirSpec;
return FSSpecExists(&dirFSSpec, &isDirectory) && isDirectory;
}
static BOOL FSSpecExists(FSSpecPtr itemSpec, BOOL *isDirectory)
{
OSErr err;
CInfoPBRec cInfo;
FSSpec tempSpec;
BOOL bExists;
bExists = FALSE;
// copy the provided file spec so PBGetCatInfo doesn't change the name
tempSpec = *itemSpec;
cInfo.dirInfo.ioVRefNum = tempSpec.vRefNum;
cInfo.dirInfo.ioDrDirID = tempSpec.parID;
cInfo.dirInfo.ioNamePtr = tempSpec.name;
cInfo.dirInfo.ioFDirIndex = 0; // use name, vRefNum, and dirID
err = PBGetCatInfoSync(&cInfo);
if (err == noErr)
{
bExists = TRUE;
if (isDirectory)
{
if ((cInfo.hFileInfo.ioFlAttrib & ioDirMask) != 0)
{
*isDirectory = TRUE;
}
else
{
*isDirectory = FALSE;
}
}
}
return bExists;
}
#else // defined USE_FSREFS
static BOOL FSRefExists(const FSRef * itemSpec, BOOL *isDirectory); // Forward declaration
BOOL CHXFileSpecUtils::FileExists(const CHXFileSpecifier& fileSpec)
{
FSRef fileRef;
BOOL isDirectory;
require_return(fileSpec.IsSet(), FALSE);
fileRef = fileSpec;
return FSRefExists(&fileRef, &isDirectory) && !isDirectory;
}
BOOL CHXFileSpecUtils::DirectoryExists(const CHXDirSpecifier& dirSpec)
{
FSRef dirRef;
BOOL isDirectory;
require_return(dirSpec.IsSet(), FALSE);
dirRef = dirSpec;
return FSRefExists(&dirRef, &isDirectory) && isDirectory;
}
static BOOL FSRefExists(const FSRef *itemRef, BOOL *isDirectory)
{
OSErr err;
BOOL bExists;
FSCatalogInfo catInfo;
const FSCatalogInfoBitmap whichInfo = kFSCatInfoNodeID | kFSCatInfoNodeFlags;
HFSUniStr255 * kDontWantName = NULL;
FSSpec * kDontWantFSSpec = NULL;
FSRef * kDontWantParentRef = NULL;
bExists = FALSE;
err = ::FSGetCatalogInfo(itemRef, whichInfo, &catInfo,
kDontWantName, kDontWantFSSpec, kDontWantParentRef);
if (err == noErr)
{
bExists = TRUE;
if (isDirectory)
{
if ((catInfo.nodeFlags & kFSNodeIsDirectoryMask) != 0)
{
*isDirectory = TRUE;
}
else
{
*isDirectory = FALSE;
}
}
}
return bExists;
}
#endif // defined USE_FSREFS
// ------------------------------------------------------------------------------------
//
// CreateDirectory
//
// ------------------------------------------------------------------------------------
HX_RESULT CHXFileSpecUtils::CreateDir(const CHXDirSpecifier& dirSpec)
{
FSSpec dirFSSpec;
long dirID;
OSErr err;
require_return(dirSpec.IsSet(), HXR_INVALID_PARAMETER);
dirFSSpec = dirSpec;
err = FSpDirCreate(&dirFSSpec, smSystemScript, &dirID);
return err;
}
// ------------------------------------------------------------------------------------
//
// RemoveDir - deletes an empty directory
//
// ------------------------------------------------------------------------------------
HX_RESULT CHXFileSpecUtils::RemoveDir(const CHXDirSpecifier& dirSpec)
{
FSSpec dirFSSpec;
OSErr err;
require_return(dirSpec.IsSet(), HXR_INVALID_PARAMETER);
dirFSSpec = dirSpec;
err = FSpDelete(&dirFSSpec);
return err;
}
// ------------------------------------------------------------------------------------
//
// RemoveFile
//
// ------------------------------------------------------------------------------------
HX_RESULT CHXFileSpecUtils::RemoveFile(const CHXFileSpecifier& fileSpec)
{
FSSpec fileFSSpec;
OSErr err;
require_return(fileSpec.IsSet(), HXR_INVALID_PARAMETER);
fileFSSpec = fileSpec;
err = FSpDelete(&fileFSSpec);
return err;
}
// ------------------------------------------------------------------------------------
//
// GetFileType
//
// ------------------------------------------------------------------------------------
FOURCC CHXFileSpecUtils::GetFileType(const CHXFileSpecifier& fileSpec)
{
FOURCC fileType;
OSErr err;
require_return(fileSpec.IsSet(), HXR_INVALID_PARAMETER);
fileType = 0;
if (fileSpec.IsSet())
{
#ifdef USE_FSREFS
FSRef fileRef;
FinderInfo fndrInfo;
Boolean isDir;
ExtendedFinderInfo * kDontWantExtendedInfo = NULL;
fileRef = fileSpec;
err = FSGetFinderInfo(&fileRef, &fndrInfo, kDontWantExtendedInfo, &isDir);
if ((err == noErr) && !isDir)
{
fileType = fndrInfo.file.fileType;
}
#else
FSSpec fileFSSpec;
FInfo fndrInfo;
fileFSSpec = fileSpec;
err = FSpGetFInfo(&fileFSSpec, &fndrInfo);
check_noerr(err);
if (err == noErr)
{
fileType = fndrInfo.fdType;
}
#endif
}
return fileType;
}
// ------------------------------------------------------------------------------------
//
// MakeNameLegal
//
// returns TRUE if the name was changed
//
// ------------------------------------------------------------------------------------
BOOL CHXFileSpecUtils::MakeNameLegal(char *pszName)
{
const char *badChars = ":";
const char replacementChar = '-';
const long maxNameLength = 31;
long len, idx;
BOOL bChanged;
require_nonnull_return(pszName, FALSE);
bChanged = FALSE;
len = strlen(pszName);
// replace any illegal characters
for (idx = 0; idx < len; idx++)
{
if (strchr(badChars, pszName[idx]))
{
pszName[idx] = replacementChar;
bChanged = TRUE;
}
}
// be sure the name isn't too long
if (len > maxNameLength)
{
pszName[maxNameLength] = 0;
bChanged = TRUE;
}
return bChanged;
}
// ------------------------------------------------------------------------------------
//
// FindFolder
//
// ------------------------------------------------------------------------------------
CHXDirSpecifier CHXFileSpecUtils::MacFindFolder(short vRefNum, FolderType foldType)
{
short foundVRefNum;
long foundDirID;
FSSpec targetSpec;
CHXDirSpecifier foundDirSpec;
OSErr err;
err = ::FindFolder(vRefNum, foldType, kCreateFolder, &foundVRefNum, &foundDirID);
if (err == noErr)
{
err = FSMakeFSSpec(foundVRefNum, foundDirID, "\p", &targetSpec);
check_noerr(err);
if (err == noErr)
{
foundDirSpec = targetSpec;
}
}
return foundDirSpec;
}
CHXFileSpecifier CHXFileSpecUtils::SpecifyFileWithMacFindFolder(short vRefNum, FolderType foldType, const char *pszChildFile)
{
CHXDirSpecifier parentDir;
CHXFileSpecifier targetFile;
parentDir = CHXFileSpecUtils::MacFindFolder(vRefNum, foldType);
check(parentDir.IsSet());
if (CHXFileSpecUtils::DirectoryExists(parentDir))
{
targetFile = parentDir.SpecifyChildFile(pszChildFile);
}
return targetFile;
}
CHXDirSpecifier CHXFileSpecUtils::SpecifyFolderWithMacFindFolder(short vRefNum, FolderType foldType, const char *pszChildFolder)
{
CHXDirSpecifier parentDir;
CHXDirSpecifier targetDir;
parentDir = CHXFileSpecUtils::MacFindFolder(vRefNum, foldType);
check(parentDir.IsSet());
if (CHXFileSpecUtils::DirectoryExists(parentDir))
{
targetDir = parentDir.SpecifyChildDirectory(pszChildFolder);
}
return targetDir;
}
// ------------------------------------------------------------------------------------
//
// ResolveFileSpecifierAlias
// ResolveDirSpecifierAlias
//
// These resolve a file spec to an alias file in place
//
// ------------------------------------------------------------------------------------
HX_RESULT CHXFileSpecUtils::ResolveFileSpecifierAlias(CHXFileSpecifier& fileSpec)
{
HX_RESULT res;
res = HXR_FAIL;
if (fileSpec.IsSet())
{
FSSpec fileFSSpec;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -