在Windows上,我想用Python將一堆文件複製到網絡上。有時,網絡沒有響應,副本停滯。我想檢查,如果發生這種情況,並跳過有問題的文件,當發生這種情況。通過詢問相關問題here,我發現了CopyFileEx函數,它允許使用回調函數,該函數可以中止文件複製。在窗口中取消python中的停頓文件副本
在Python的實現看起來像這樣:
import win32file
def Win32_CopyFileEx(ExistingFileName, NewFileName, Canc = False):
win32file.CopyFileEx(
ExistingFileName, # PyUNICODE | File to be copied
NewFileName, # PyUNICODE | Place to which it will be copied
Win32_CopyFileEx_ProgressRoutine, # CopyProgressRoutine | A python function that receives progress updates, can be None
Data = None, # object | An arbitrary object to be passed to the callback function
Cancel = Canc, # boolean | Pass True to cancel a restartable copy that was previously interrupted
CopyFlags = win32file.COPY_FILE_RESTARTABLE, # int | Combination of COPY_FILE_* flags
Transaction = None # PyHANDLE | Handle to a transaction as returned by win32transaction::CreateTransaction
)
從CopyFileEx函數的文檔,我可以看到正在運行的副本取消的兩種可能性。
pbCancel [在,可選]如果複製操作期間這個標誌被設置爲TRUE ,則操作被取消。否則,複製 操作將繼續完成。
我想不出如何做到這一點。我試着用相同的文件句柄再次調用相同的函數,但是將取消標誌設置爲TRUE
,但由於有問題的文件正在被另一個進程使用,導致出現錯誤。
另一種可能性似乎是回調函數:
lpProgressRoutine [在,可選],每當的 另一部分文件已被時間稱爲 類型LPPROGRESS_ROUTINE的回調函數的地址複製。該參數可以是NULL。有關進度回調函數的更多 信息,請參閱 CopyProgressRoutine函數。
documentation of this ProgressRoutine指出,此回調要麼在複製開始時要麼調用,或者文件的垃圾完成複製時調用。回叫功能可以取消複製過程,如果它返回1
或2
(取消,停止)。但是,當垃圾副本停滯時,此回調函數似乎不會被調用。
所以我的問題是:如何在每個文件的基礎上取消這個副本,當它停滯?
只是:哇。這比我原先想象的要困難得多。我會在我的相關鏈接中加入這個答案的鏈接。 – Dschoni