コード例 #1
0
ファイル: sqMacFileCopy.c プロジェクト: Geal/Squeak-VM
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;
} 
コード例 #2
0
ファイル: hxdir_carbon.cpp プロジェクト: muromec/qtopia-ezx
// 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);
}
コード例 #3
0
ファイル: tclMacFCmd.c プロジェクト: durandj/devkitadv
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;
}