int sqCopyFilesizetosize(char *srcNameIndex, int srcNameSize, char *dstNameIndex, int dstNameSize) { OSErr error; FSSpec srcSpec,dstFileSpec,dstSpec; char *pointer; const int desiredBufferSize = 64*1024; FSpLocationFromFullPath(srcNameSize,srcNameIndex,&srcSpec); FSpLocationFromFullPath(dstNameSize,dstNameIndex,&dstFileSpec); FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID, "\p:", &dstSpec); #if TARGET_API_MAC_CARBON pointer = NewPtr(desiredBufferSize); #else pointer = NewPtr(desiredBufferSize); if (pointer == NULL) pointer = NewPtrSys(desiredBufferSize); if (pointer == NULL) return false; #endif error = FSpFileCopy(&srcSpec, &dstSpec, dstFileSpec.name, pointer, desiredBufferSize, false); DisposePtr((void *)pointer); return error; }
// this moves or copies and renames a file // // This is not related to the current directory HXBOOL CHXDirectory::MoveRename(const char* szSrcName, const char* szDestName, HXBOOL bMove) { OSErr err; HXBOOL bOnSameVolume; Str255 pascDestFileName; CHXFileSpecifier srcFileSpec = szSrcName; CHXFileSpecifier destFileSpec = szDestName; CHXDirSpecifier destFileDir = destFileSpec.GetParentDirectory(); CHXString strDestFileName = destFileSpec.GetName(); // delete anything at our target location CHXFileSpecUtils::RemoveFile(destFileSpec); bOnSameVolume = (srcFileSpec.GetVRefNum() == destFileSpec.GetVRefNum()); if (bMove && bOnSameVolume) { strDestFileName.MakeStr255(pascDestFileName); err = FSpMoveRenameCompat((FSSpec *) srcFileSpec, (FSSpec *) destFileDir, pascDestFileName); } if (!bMove || !bOnSameVolume) { CHXString strBuffer; const int kBufferSize = 40000; char *pBuff = strBuffer.GetBuffer(kBufferSize); check_nonnull(pBuff); strDestFileName.MakeStr255(pascDestFileName); err = FSpFileCopy((FSSpec *) srcFileSpec, (FSSpec *) destFileDir, pascDestFileName, pBuff, kBufferSize, FALSE); } // should we delete the source if bMove and we successfully copied it? return (err == noErr); }
int TclpCopyFile( char *src, /* Pathname of file to be copied. */ char *dst) /* Pathname of file to copy to. */ { OSErr err, dstErr; Boolean dstExists, dstIsDirectory, dstLocked; FSSpec srcFileSpec, dstFileSpec, dstDirSpec, tmpFileSpec; Str31 tmpName; err = FSpLocationFromPath(strlen(src), src, &srcFileSpec); if (err == noErr) { err = GetFileSpecs(dst, &dstFileSpec, &dstDirSpec, &dstExists, &dstIsDirectory); } if (dstExists) { if (dstIsDirectory) { errno = EISDIR; return TCL_ERROR; } err = FSpGetFLockCompat(&dstFileSpec, &dstLocked); if (dstLocked) { FSpRstFLockCompat(&dstFileSpec); } /* * Backup dest file. */ dstErr = GenerateUniqueName(dstFileSpec.vRefNum, dstFileSpec.parID, dstFileSpec.parID, tmpName); if (dstErr == noErr) { dstErr = FSpRenameCompat(&dstFileSpec, tmpName); } } if (err == noErr) { err = FSpFileCopy(&srcFileSpec, &dstDirSpec, (StringPtr) dstFileSpec.name, NULL, 0, true); } if ((dstExists != false) && (dstErr == noErr)) { FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID, tmpName, &tmpFileSpec); if (err == noErr) { /* * Delete backup file. */ FSpDeleteCompat(&tmpFileSpec); } else { /* * Restore backup file. */ FSpDeleteCompat(&dstFileSpec); FSpRenameCompat(&tmpFileSpec, dstFileSpec.name); if (dstLocked) { FSpSetFLockCompat(&dstFileSpec); } } } if (err != noErr) { errno = TclMacOSErrorToPosixError(err); return TCL_ERROR; } return TCL_OK; }