📄 hx_morefiles.cpp
字号:
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); }//ifCleanUp: //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.BooleanFSpGetFileAge(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 formOSErr 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 cleanupCantMoveRename: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 cleanupCantSetFInfo: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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -