def copyOrMove(elem, copy_move_flag, overwrite): if copy_move_flag == COPY: f = 0 if overwrite else win32file.COPY_FILE_FAIL_IF_EXISTS win32file.CopyFileEx(elem.path, elem.destpath, None, None, False, f) else: f = win32file.MOVEFILE_COPY_ALLOWED | win32file.MOVEFILE_REPLACE_EXISTING if overwrite else win32file.MOVEFILE_COPY_ALLOWED win32file.MoveFileEx(elem.path, elem.destpath, f)
DestinationFile) # if TotalBytesTransferred > 100000: # return win32file.PROGRESS_STOP return win32file.PROGRESS_CONTINUE temp_dir = win32api.GetTempPath() fsrc = win32api.GetTempFileName(temp_dir, 'cfe')[0] fdst = win32api.GetTempFileName(temp_dir, 'cfe')[0] print(fsrc, fdst) f = open(fsrc, 'w') f.write('xxxxxxxxxxxxxxxx\n' * 32768) f.close() # add a couple of extra data streams f = open(fsrc + ':stream_y', 'w') f.write('yyyyyyyyyyyyyyyy\n' * 32768) f.close() f = open(fsrc + ':stream_z', 'w') f.write('zzzzzzzzzzzzzzzz\n' * 32768) f.close() operation_desc = 'Copying ' + fsrc + ' to ' + fdst win32file.CopyFileEx(fsrc, fdst, ProgressRoutine, Data=operation_desc, Cancel=False, CopyFlags=win32file.COPY_FILE_RESTARTABLE, Transaction=None)
def Execute(op, resume=False): """実行処理。リトライが必要になった項目数を返す。""" if resume: log.debug("Starting as resume mode...") retry = 0 try: f = op.instructions["target"] except KeyError: log.error("Required key is not specified.") return False #end 処理刷るものなし copy_move_flag = op.instructions["copy_move_flag"] if not resume: # resume modeではない=初期化 op.output["all_OK"] = True op.output["retry"]["target"] = [] op.output["percentage"] = 0 op.output["copy_move_flag"] = copy_move_flag #ベースパスを決定 op.output["basepath"] = os.path.dirname(f[0]) op.output["destpath"] = op.instructions['to'] #end 初期化 basepath = op.output["basepath"] destpath = op.output["destpath"] log.debug("Base path: %s dest path: %s" % (basepath, destpath)) log.debug("Retrieving file list...") lst = [] for elem in f: if not basepath in elem: debug.log("Ummatched base path, skipping %s" % elem) continue #end ベースパスが合わない if os.path.isfile(elem): lst.append(Element(elem, basepath, destpath)) else: e = Element(elem, basepath, destpath) if os.path.isdir(e.destpath) and not resume: _processExistingFolder( op.output, elem) #フォルダがもうあれば、その時点で確認に入れる(中のフォルダを展開しない) else: #まだないか、確認済みなので追加 _expandFolder(lst, elem, e, basepath, destpath) #end フォルダを展開するかしないか #end フォルダだった #end ファイルリスト作るループ #ファイルリスト作ったので、もともとの target に上書き f = lst log.debug("%d items found." % len(f)) #コピーサイズの合計を計算 total = 0 for elem in f: if elem.size != -1: total += elem.size #end サイズを足す op.output['total_bytes'] = total op.output['current_bytes'] = 0 log.debug("Size: %d bbytes" % total) log.debug("Start copying...") overwrite = 0 if resume else win32file.COPY_FILE_FAIL_IF_EXISTS for elem in f: if elem.destpath is None: #フォルダ削除用 try: win32.RemoveDirectory(elem.path, None) except win32file.error as err: log.debug( "Error encountered when trying to delete moved folder: %s" % str(err)) #end except #end フォルダ消す try: if elem.isfile: win32file.CopyFileEx(elem.path, elem.destpath, None, None, False, overwrite) else: if resume and os.path.isdir(elem.destpath): continue #再開している場合はエラーになる前に逃げる win32file.CreateDirectory(elem.destpath, None) except win32file.error as err: log.error("Cannot create %s (%s)" % (elem.destpath, str(err))) ProcessError(op.output, elem, str(err), resume) continue #end except if copy_move_flag == MOVE: try: if elem.isfile: win32file.DeleteFile(elem.path) except win32file.error as err: log.debug("Error encountered when deleting moved file: %s" % str(err)) #end except #end 移動モード op.output["succeeded"] += 1 #end 削除処理 if len(op.output["retry"]["target"]) > 0: op.output["retry"]["operation"] = VERB retry = len(op.output["retry"]["target"]) #end リトライあるか #終わった者はもう使わないので、ファイルリストは消してしまう op.instructions["target"] = [] return retry