VFP檔案複製

來源:互聯網
上載者:User

PARAMETERS filename,pathname<br />*-----------------------------------------------------------------------------------------------------------------------------------------<br />* IN<br />*2009-03-20 YangAifeng<br />*註冊外部 Windows 32 位動態連結程式庫 ( .DLL ) 中的一個函數。<br />*-----------------------------------------------------------------------------------------------------------------------------------------</p><p>*SHFileOperation<br />*函數功能描述:檔案操作,與 Shell 的動作相同.<br />DECLARE Integer SHFileOperation IN SHELL32.dll String @ LPSHFILEOPSTRUCT<br />*------------------------------------------------------------------------------------------------------------------------------------------<br />*函數功能:該函數可以獲得與調用線程的訊息佇列相關的使用中視窗的視窗控制代碼。<br />DECLARE Integer GetActiveWindow IN WIN32API<br />*------------------------------------------------------------------------------------------------------------------------------------------<br />*ShellExecute的功能是運行一個外部程式(或者是開啟一個登入的檔案、開啟一個目錄、列印一個檔案等等),並對外部程式有一定的控制。<br />DECLARE INTEGER ShellExecute IN "Shell32.dll" ;</p><p> INTEGER hwnd, ;<br /> STRING lpVerb, ;<br /> STRING lpFile, ;<br /> STRING lpParameters, ;<br /> STRING lpDirectory, ;<br /> LONG nShowCmd</p><p>oHeap =CREATEOBJECT("Heap")<br />#define FO_COPY 2<br />#define FOF_NOCONFIRMATION 0x10 && 不提示使用者.<br />#define FOF_NOCONFIRMMKDIR 0x200 && 不建立新目錄<br />*cSourceString = HOME() +"tools/*.*" +CHR(0) +CHR(0)<br />**cSourceString = JUSTPATH(getdir()) +"/*.*"+CHR(0) +CHR(0) &&目錄下所有的檔案拷貝<br />cSourceString =filename+ CHR(0) +CHR(0)<br />MESSAGEBOX(cSourceString,0,"資訊視窗") &&拷貝單個的檔案<br />cDestString = pathname + CHR(0) +CHR(0)<br />*cDestString = "C:/temp" + CHR(0) +CHR(0)<br />nStringBase = oHeap.AllocBlob(cSourceString+cDestString)<br />cFileOpStruct = NumToDWORD(GetActiveWindow())+;<br /> NumToDWORD(FO_COPY)+;<br /> NumToDWORD(nStringBase)+;<br /> NumToDWORD(nStringBase + LEN(cSourceString))+;<br /> NumToDWORD(FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR)+;<br /> CHR(0)+;<br /> NumToDWORD(0)+NumToDWORD(0)</p><p>IF SHFileOperation(cFileOpStruct) = 0<br /> MESSAGEBOX("檔案已成功地複製",0,"資訊視窗" )<br /> * =ShellExecute(0, "open","//shenzhen-pic/test$", NULL, NULL, 1) &&開啟目錄<br />ELSE<br /> MESSAGEBOX("複製檔案時發生錯誤",0,"資訊視窗" )<br />* WAIT WINDOW NOWAIT"複製檔案時發生錯誤"<br />ENDIF<br />oHeap = '' </p><p>*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br />*************************************************************************************************************************<br />*建立一個使用者自訂類或子類,並為建立的類或子類指定屬性、事件和方法。<br />*通過指定 ParentClass 為 Custom,可以建立一個非可視的使用者自訂類。<br />DEFINE CLASS heap AS custom </p><p>PROTECTED inHandle, inNumAllocsActive,iaAllocs[1,3]<br />inHandle = NULL<br />inNumAllocsActive = 0<br />iaAllocs = NULL<br />Name = "heap"<br />*----------------------------------------------------------------------------------<br />PROCEDURE Alloc<br />* 分配一個塊, 返回一個指向它的指標<br />LPARAMETER nSize<br />DECLARE INTEGER HeapAlloc IN WIN32API AS HAlloc;<br />INTEGER hHeap, ;<br />INTEGER dwFlags, ;<br />INTEGER dwBytes<br />DECLARE INTEGER HeapSize IN WIN32API AS HSize ;<br />INTEGER hHeap, ;<br />INTEGER dwFlags, ;<br />INTEGER lpcMem<br />LOCAL nPtr<br />WITH this<br />nPtr = HAlloc(.inHandle, 0, @nSize)<br />IF nPtr # 0<br />* 塊分配數組<br />.inNumAllocsActive = .inNumAllocsActive + 1<br />DIMENSION .iaAllocs[.inNumAllocsActive,3]<br />* 指標<br />.iaAllocs[.inNumAllocsActive,1] = nPtr<br />* 分配的實際大小 - 由HeapSize() 獲得<br />.iaAllocs[.inNumAllocsActive,2] = HSize(.inHandle, 0, nPtr)<br />.iaAllocs[.inNumAllocsActive,3] = .T.<br />ELSE<br />* HeapAlloc() 失敗- 返回NULL指標<br />nPtr = NULL<br />ENDIF<br />ENDWITH<br />RETURN nPtr<br />ENDPROC<br />*------------------------------------------------------------------------------------<br />FUNCTION AllocBLOB<br />*分配一塊能傳遞BString大小的記憶體, The<br /> LPARAMETER cBStringToCopy<br />LOCAL nAllocPtr<br />WITH this<br />nAllocPtr = .Alloc(LEN(cBStringToCopy))<br />IF ! ISNULL(nAllocPtr)<br />.CopyTo(nAllocPtr,cBStringToCopy)<br />ENDIF<br />ENDWITH<br />RETURN nAllocPtr<br />ENDFUNC<br />*------------------------------------------------------------------------------------<br />FUNCTION AllocString<br />LPARAMETER cString<br />RETURN this.AllocBLOB(cString + CHR(0))<br />ENDFUNC<br />*------------------------------------------------------------------------------------<br />FUNCTION AllocInitAs<br />* 分配一塊記憶體初始化成CHR(nByteValue)<br />LPARAMETER nSizeOfBuffer, nByteValue<br />IF TYPE('nByteValue') # 'N' OR ! BETWEEN(nByteValue,0,255)<br />*預設初始化為nulls<br />nByteValue = 0<br />ENDIF<br />RETURN this.AllocBLOB(REPLICATE(CHR(nByteValue),nSizeOfBuffer))<br />ENDFUNC<br />*------------------------------------------------------------------------------------<br />PROCEDURE DeAlloc<br />* 丟棄以前的分配塊<br />LPARAMETER nPtr<br />DECLARE INTEGER HeapFree IN WIN32API AS HFree ;<br />INTEGER hHeap, ;<br />INTEGER dwFlags, ;<br />INTEGER lpMem<br />LOCAL nCtr<br /> nCtr = NULL<br />WITH this<br />nCtr = .FindAllocID(nPtr)<br />IF ! ISNULL(nCtr)<br />=HFree(.inHandle, 0, nPtr)<br />.iaAllocs[nCtr,3] = .F.<br />ENDIF<br />ENDWITH<br />RETURN ! ISNULL(nCtr)<br />ENDPROC<br />*--------------------------------------------------------------------------------------</p><p>PROCEDURE CopyTo<br />* 複製一個VFP字串到塊<br />LPARAMETER nPtr, cSource<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;<br />INTEGER nDestBuffer, ;<br />STRING @pVoidSource, ;<br />INTEGER nLength<br />LOCAL nCtr<br />nCtr = NULL<br /> IF TYPE('nPtr') = 'N' AND TYPE('cSource') $ 'CM' ;<br /> AND ! (ISNULL(nPtr) OR ISNULL(cSource))<br />WITH this<br />* 通過nPtr尋找分配點<br />nCtr = .FindAllocID(nPtr)<br />IF ! ISNULL(nCtr)<br />* 複製較小的緩衝區或原字串<br />=RtlCopy((.iaAllocs[nCtr,1]), ;<br />cSource, ;<br />MIN(LEN(cSource),.iaAllocs[nCtr,2]))<br />ENDIF<br />ENDWITH<br />ENDIF<br />RETURN ! ISNULL(nCtr)<br />ENDPROC</p><p>*-------------------------------------------------------------------------------------<br />PROCEDURE CopyFrom<br />* 複製緩衝區內容到VFP<br />LPARAMETER nPtr<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;<br />STRING @DestBuffer, ;<br />INTEGER pVoidSource, ;<br />INTEGER nLength<br />LOCAL nCtr, uBuffer<br />uBuffer = NULL<br />nCtr = NULL<br />IF TYPE('nPtr') = 'N' AND ! ISNULL(nPtr)<br />WITH this<br />* 尋找地址為nPtr的分配塊<br />nCtr = .FindAllocID(nPtr)<br />IF ! ISNULL(nCtr)<br />* 在VFP中分配一個足夠大的緩衝區來接收塊<br />uBuffer = REPL(CHR(0),.iaAllocs[nCtr,2])<br />=RtlCopy(@uBuffer, ;<br />(.iaAllocs[nCtr,1]), ;<br />(.iaAllocs[nCtr,2]))<br />ENDIF<br />ENDWITH<br />ENDIF<br />RETURN uBuffer<br />ENDPROC<br />*------------------------------------------------------------------------------------<br />PROTECTED FUNCTION FindAllocID<br /> LPARAMETER nPtr<br /> LOCAL nCtr<br /> WITH this<br />FOR nCtr = 1 TO .inNumAllocsActive<br />IF .iaAllocs[nCtr,1] = nPtr AND .iaAllocs[nCtr,3]<br />EXIT<br />ENDIF<br />ENDFOR<br />RETURN IIF(nCtr <= .inNumAllocsActive,nCtr,NULL)<br />ENDWITH<br />ENDPROC<br />*-------------------------------------------------------------------------------------<br />PROCEDURE SizeOfBlock<br />* 檢索一個分配塊的實際記憶體大小<br />LPARAMETERS nPtr<br />LOCAL nCtr, nSizeOfBlock<br />nSizeOfBlock = NULL<br />WITH this<br />* 尋找地址為nPtr的分配塊<br />nCtr = .FindAllocID(nPtr)<br />RETURN IIF(ISNULL(nCtr),NULL,.iaAllocs[nCtr,2])<br />ENDWITH<br />ENDPROC<br />*------------------------------------------------------------------------------------<br />PROCEDURE Destroy<br />DECLARE HeapDestroy IN WIN32API AS HDestroy ;<br /> INTEGER hHeap </p><p>LOCAL nCtr<br />WITH this<br />FOR nCtr = 1 TO .inNumAllocsActive<br />IF .iaAllocs[nCtr,3]<br />.Dealloc(.iaAllocs[nCtr,1])<br />ENDIF<br />ENDFOR<br />HDestroy[.inHandle]<br />ENDWITH<br />DODEFAULT()<br />ENDPROC</p><p>*------------------------------------------------------------------------------------<br />PROCEDURE Init<br />DECLARE INTEGER HeapCreate IN WIN32API AS HCreate ;<br />INTEGER dwOptions, ;<br />INTEGER dwInitialSize, ;<br />INTEGER dwMaxSize<br />#DEFINE SwapFilePageSize 4096<br />#DEFINE BlockAllocSize 2 * SwapFilePageSize<br />WITH this<br />.inHandle = HCreate(0, BlockAllocSize, 0)<br />DIMENSION .iaAllocs[1,3]<br />.iaAllocs[1,1] = 0<br />.iaAllocs[1,2] = 0<br />.iaAllocs[1,3] = .F.<br />.inNumAllocsActive = 0<br />ENDWITH<br />RETURN (this.inHandle # 0)<br />ENDPROC</p><p>ENDDEFINE<br />***********************************************************************************************************************<br />*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br />*---------------------------------------------------------------------------------------<br />FUNCTION SetMem<br />LPARAMETERS nPtr, cSource<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;<br />INTEGER nDestBuffer, ;<br />STRING @pVoidSource, ;<br />INTEGER nLength </p><p>RtlCopy(nPtr, ;<br />cSource, ;<br />LEN(cSource))<br />RETURN .T.<br />*---------------------------------------------------------------------------------------<br />FUNCTION GetMem<br />LPARAMETERS nPtr, nLen<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;<br />STRING @DestBuffer, ;<br />INTEGER pVoidSource, ;<br />INTEGER nLength<br />LOCAL uBuffer<br />* 分配一個足夠大的緩衝區來接收塊<br />uBuffer = REPL(CHR(0),nLen)<br />=RtlCopy(@uBuffer, ;<br /> nPtr, ;<br /> nLen)<br />RETURN uBuffer<br />*---------------------------------------------------------------------------------------<br />FUNCTION GetMemString<br />LPARAMETERS nPtr, nSize<br />DECLARE INTEGER lstrcpyn IN WIN32API AS StrCpyN ;<br />STRING @ lpDestString, ;<br />INTEGER lpSource, ;<br />INTEGER nMaxLength<br />LOCAL uBuffer<br />IF TYPE('nSize') # 'N' OR ISNULL(nSize)<br />nSize = 512<br />ENDIF<br />* 分配一個足夠大的緩衝區來接收資料<br />uBuffer = REPL(CHR(0), nSize)<br />IF StrCpyN(@uBuffer, nPtr, nSize-1) # 0<br />uBuffer = LEFT(uBuffer, MAX(0,AT(CHR(0),uBuffer) - 1))<br />ELSE<br />uBuffer = NULL<br />ENDIF<br />RETURN uBuffer<br />*----------------------------------------------------------------------------------------<br />FUNCTION SHORTToNum<br />* 轉變結構中的16位帶正負號的整數到VFP數值型<br /> LPARAMETER tcInt<br />LOCAL b0,b1,nRetVal<br />b0=asc(tcInt)<br />b1=asc(subs(tcInt,2,1))<br />if b1<128<br />nRetVal=b1 * 256 + b0<br />else<br />b1=255-b1<br />b0=256-b0<br />nRetVal= -( (b1 * 256) + b0)<br />endif<br />return nRetVal<br />*-----------------------------------------------------------------------------------------<br />FUNCTION NumToSHORT<br />LPARAMETER tnNum<br />LOCAL b0,b1,x<br />IF tnNum>=0<br />x=INT(tnNum)<br />b1=INT(x/256)<br />b0=MOD(x,256)<br />ELSE<br />x=INT(-tnNum)<br />b1=255-INT(x/256)<br />b0=256-MOD(x,256)<br />IF b0=256<br />b0=0<br />b1=b1+1<br />ENDIF<br />ENDIF<br />RETURN CHR(b0)+CHR(b1)<br />*------------------------------------------------------------------------------<br />FUNCTION DWORDToNum<br />LPARAMETER tcDWORD<br />LOCAL b0,b1,b2,b3<br />b0=asc(tcDWORD)<br />b1=asc(subs(tcDWORD,2,1))<br />b2=asc(subs(tcDWORD,3,1))<br />b3=asc(subs(tcDWORD,4,1))<br />RETURN ( ( (b3 * 256 + b2) * 256 + b1) * 256 + b0)<br />*------------------------------------------------------------------------------<br />FUNCTION NumToDWORD<br />LPARAMETER tnNum<br />RETURN NumToLong(tnNum) </p><p>FUNCTION WORDToNum<br />LPARAMETER tcWORD<br />RETURN (256 * ASC(SUBST(tcWORD,2,1)) ) + ASC(tcWORD)<br />*------------------------------------------------------------------------------<br />FUNCTION NumToWORD<br />LPARAMETER tnNum<br />LOCAL x<br />x=INT(tnNum)<br />RETURN CHR(MOD(x,256))+CHR(INT(x/256))<br />*------------------------------------------------------------------------------<br />FUNCTION NumToLong<br />LPARAMETER tnNum<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopyLong ;<br />STRING @pDestString, ;<br />INTEGER @pVoidSource, ;<br />INTEGER nLength<br />LOCAL cString<br />cString = SPACE(4)<br /> =RtlCopyLong(@cString, BITOR(tnNum,0), 4)<br />RETURN cString<br />*------------------------------------------------------------------------------<br />FUNCTION LongToNum<br />LPARAMETER tcLong<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopyLong ;<br />INTEGER @ DestNum, ;<br />STRING @ pVoidSource, ;<br />INTEGER nLength<br />LOCAL nNum<br />nNum = 0<br />=RtlCopyLong(@nNum, tcLong, 4)<br />RETURN nNum<br />*------------------------------------------------------------------------------<br />FUNCTION AllocNetAPIBuffer<br />LPARAMETER nSize<br />IF TYPE('nSize') # 'N' OR nSize <= 0<br />*傳遞地非法參數,所以返回NULL<br />RETURN NULL<br />ENDIF<br />IF ! 'NT' $ OS()<br />*僅支援在NT下API調用, 所以返回失敗<br />RETURN NULL<br />ENDIF<br />DECLARE INTEGER NetApiBufferAllocate IN NETAPI32.DLL ;<br />INTEGER dwByteCount, ;<br />INTEGER lpBuffer<br />LOCAL nBufferPointer<br />nBufferPointer = 0<br />IF NetApiBufferAllocate(INT(nSize), @nBufferPointer) # 0<br />* 調用錯誤,所以返回一個NULL值<br />nBufferPointer = NULL<br />ENDIF<br />RETURN nBufferPointer<br />*------------------------------------------------------------------------------<br />FUNCTION DeAllocNetAPIBuffer<br />LPARAMETER nPtr<br />IF TYPE('nPtr') # 'N'<br />*傳遞了非法參數,所以返回失敗<br />RETURN .F.<br />ENDIF<br />IF ! 'NT' $ OS()<br />*僅支援在NT下API調用, 所以返回失敗<br />RETURN .F.<br />ENDIF<br />DECLARE INTEGER NetApiBufferFree IN NETAPI32.DLL ;<br />INTEGER lpBuffer<br />RETURN (NetApiBufferFree(INT(nPtr)) = 0) </p><p>Function CopyDoubleToString<br />LPARAMETER nDoubleToCopy<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopyDbl ;<br />STRING @DestString, ;<br />DOUBLE @pVoidSource, ;<br />INTEGER nLength<br />LOCAL cString<br />cString = SPACE(8)<br />=RtlCopyDbl(@cString, nDoubleToCopy, 8)<br />RETURN cString<br />*------------------------------------------------------------------------------<br />FUNCTION DoubleToNum<br />LPARAMETER cDoubleInString<br />DECLARE RtlMoveMemory IN WIN32API AS RtlCopyDbl ;<br />DOUBLE @DestNumeric, ;<br />STRING @pVoidSource, ;<br />INTEGER nLength<br />LOCAL nNum<br />nNum = 0.000000000000000000<br />=RtlCopyDbl(@nNum, cDoubleInString, 8)<br />RETURN nNum<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.