hx_morefiles.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 642 行 · 第 1/2 页
CPP
642 行
short theResFile=-1;
Boolean theResult=false;
Str255 message;
saveResFile=CurResFile();
if (theFile == 0L) goto CleanUp;
if (theversion == 0L) goto CleanUp;
theResFile=FSpOpenResFile(theFile,fsRdPerm);
if (theResFile != -1) {
r = GetResource('vers',1);
if (r==0L) goto CleanUp;
HLock(r);
HNoPurge(r);
*r+=(sizeof(Byte)*4)+sizeof(short);
*r+=**r;
BlockMove(*r,message,sizeof(Str255));
#ifdef _CARBON
p2cstrcpy((char*)message, message);
#else
p2cstr(message);
#endif
SafeStrCpy(theversion,(char *)message, ulBufLen);
}//if
CleanUp:
//if (theResFile >=0) CloseResFile(theResFile);
UseResFile(saveResFile);
return(theResult);
}
//
// FSpGetFileAge
//
// This function returns the age of a file relative to the current time.
//
// It is legal to pass in NULL if you don't want a particular age granularity.
Boolean
FSpGetFileAge(FSSpec* file,long* minutes,long* seconds,long* ticks)
{
HParmBlkPtr fileinfo=(HParmBlkPtr)NewPtrClear(sizeof(HParamBlockRec));
Boolean theResult=false;
unsigned long curseconds;
GetDateTime(&curseconds); // seconds since 1904
if (file == 0L) goto CleanUp;
if (fileinfo == 0L) goto CleanUp;
fileinfo->fileParam.ioNamePtr=file->name;
fileinfo->fileParam.ioDirID=file->parID;
fileinfo->fileParam.ioVRefNum=file->vRefNum;
if (noErr != PBHGetFInfoSync(fileinfo)) goto CleanUp;
if (ticks != NULL)
{
unsigned long createTicks = (fileinfo->fileParam.ioFlCrDat * 60);
unsigned long curticks = curseconds * 60;
*ticks=curticks - createTicks;
if (*ticks < 0)
*ticks = 0;
}
if (seconds != NULL)
{
unsigned long createSecs = fileinfo->fileParam.ioFlCrDat;
*seconds=curseconds - createSecs;
if (*seconds < 0)
*seconds = 0;
}
if (minutes != NULL)
{
unsigned long createMinutes = fileinfo->fileParam.ioFlCrDat / 60;
unsigned long curMinutes = curseconds / 60;
*minutes = (curMinutes - createMinutes);
if (*minutes < 0)
*minutes = 0;
}
theResult=true;
CleanUp:
if (fileinfo != 0L) DisposePtr((Ptr)fileinfo);
return (theResult);
}
Boolean
IsFolder(FSSpec* spec)
{
long dirID;
Boolean isDir;
OSErr err;
err = FSpGetDirectoryID(spec, &dirID, &isDir);
return ((err == noErr) && isDir);
}
OSErr GetMoreVInfo(short volref, StringPtr name, unsigned long *volcreated, Boolean *islocked)
{
HVolumeParam block;
OSErr err;
memset(&block, 0x00, sizeof(block));
block.ioVolIndex = 0;
block.ioVRefNum = volref;
block.ioNamePtr = name;
err = PBHGetVInfoSync((HParmBlkPtr)&block);
if (!err) {
if (islocked) *islocked = (block.ioVAtrb & (1<<7)) != 0;
if (volcreated) *volcreated = block.ioVCrDate;
}
return err;
}
#ifdef _CARBON
// Stuff that used to be in MoreFilesExtras but isn't in MoreFilesX in FSSpec form
OSErr FSpGetDirectoryID(const FSSpec* pDirSpec, long *pDirID, Boolean *pIsDir)
{
FSRef dirRef;
Boolean isDir = false;
long dirID = 0;
OSErr err;
err = FSpMakeFSRef(pDirSpec, &dirRef);
if (err == noErr)
{
err = FSGetNodeID(&dirRef, &dirID, &isDir);
}
if (pDirID) *pDirID = dirID;
if (pIsDir) *pIsDir = isDir;
return err;
}
OSErr FSpMoveRenameCompat(const FSSpec * srcSpec, const FSSpec * dstSpec, ConstStr255Param copyName)
{
FSRef srcRef, destDirRef, newRef;
HFSUniStr255 hfsUniName;
OSErr err;
err = FSpMakeFSRef(srcSpec, &srcRef);
require_noerr(err, CantMakeSrcRef);
err = FSpMakeFSRef(dstSpec, &destDirRef);
require_noerr(err, CantMakeDestRef);
if (copyName)
{
err = HFSNameGetUnicodeName(copyName, kTextEncodingUnknown, &hfsUniName);
require_noerr(err, CantMakeUnicodeName);
}
err = FSMoveRename(&srcRef, &destDirRef, hfsUniName.length, copyName ? hfsUniName.unicode : NULL,
kTextEncodingUnknown, &newRef);
require_noerr(err, CantMoveRename);
return noErr;
// reverse-order cleanup
CantMoveRename:
CantMakeUnicodeName:
CantMakeDestRef:
CantMakeSrcRef:
return err;
}
OSErr DeleteDirectory(short vRefNum, long dirID, ConstStr255Param name)
{
FSRef dirRef;
OSErr err;
err = FSMakeFSRef(vRefNum, dirID, name, &dirRef);
if (err == noErr)
{
err = FSDeleteContainerContents(&dirRef);
}
return err;
}
OSErr FSpFileCopy(const FSSpec *srcSpec, const FSSpec *dstSpec, ConstStr255Param copyName,
void *copyBufferPtr, long copyBufferSize, Boolean preflight)
{
// Ultimately, this should be replaced with a new one that accompanies MoreFilesX, but that's not
// yet available from Apple
void *pBuff = NULL;
long dirID;
Str255 newName;
FSSpec newSpec;
short srcRefNum = -1;
short destRefNum = -1;
FInfo fInfo;
OSErr err;
// get a buffer to use for copying
if (copyBufferPtr)
{
pBuff = copyBufferPtr;
}
else
{
copyBufferSize = 16*1024;
pBuff = NewPtr(copyBufferSize);
}
require_nonnull(pBuff, CantGetBuffer);
// copy the name of the new file
if (copyName)
{
BlockMoveData(©Name[0], &newName[0], 1 + copyName[0]);
}
else
{
BlockMoveData(&srcSpec->name[0], &newName[0], 1 + srcSpec->name[0]);
}
// make a new file; bail if it already exists
err = FSpGetDirectoryID(dstSpec, &dirID, NULL);
require_noerr(err, CantGetDirID);
err = FSMakeFSSpec(dstSpec->vRefNum, dirID, newName, &newSpec);
require(err == fnfErr, FileExistsAlready);
// create the file
err = FSpCreate(&newSpec, 0, 0, smSystemScript);
require_noerr(err, CantMakeNewFile);
// copy the data forks
err = FSpOpenDF(srcSpec, fsRdPerm, &srcRefNum);
require_noerr(err, CantOpenSourceDF);
err = FSpOpenDF(&newSpec, fsRdWrPerm, &destRefNum);
require_noerr(err, CantOpenDestDF);
err = FSCopyFork(srcRefNum, destRefNum, pBuff, copyBufferSize);
require_noerr(err, CantCopyDataFork);
FSClose(srcRefNum);
FSClose(destRefNum);
srcRefNum = -1;
destRefNum = -1;
// copy the resource forks
err = FSpOpenRF(srcSpec, fsRdPerm, &srcRefNum);
require_noerr(err, CantOpenSourceRF);
err = FSpOpenRF(&newSpec, fsRdWrPerm, &destRefNum);
require_noerr(err, CantOpenDestRF);
err = FSCopyFork(srcRefNum, destRefNum, pBuff, copyBufferSize);
require_noerr(err, CantCopyResourceFork);
FSClose(srcRefNum);
FSClose(destRefNum);
srcRefNum = -1;
destRefNum = -1;
// copy Finder info
err = FSpGetFInfo(srcSpec, &fInfo);
require_noerr(err, CantGetFInfo);
fInfo.fdLocation.h = fInfo.fdLocation.v = 0;
fInfo.fdFldr = 0;
fInfo.fdFlags &= ~kHasBeenInited;
err = FSpSetFInfo(&newSpec, &fInfo);
require_noerr(err, CantSetFInfo);
// we're done with the buffer; dispose it if we allocated it here
if (copyBufferPtr == NULL)
{
DisposePtr((Ptr) pBuff);
}
return noErr;
// reverse-order cleanup
CantSetFInfo:
CantGetFInfo:
CantCopyResourceFork:
CantOpenDestRF:
CantOpenSourceRF:
CantCopyDataFork:
if (destRefNum != -1) FSClose(destRefNum);
CantOpenDestDF:
if (srcRefNum != -1) FSClose(srcRefNum);
CantOpenSourceDF:
FSpDelete(&newSpec);
CantMakeNewFile:
FileExistsAlready:
CantGetDirID:
if (pBuff && !copyBufferPtr)
{
DisposePtr((Ptr) pBuff);
}
CantGetBuffer:
return err;
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?