Есть ли способ отследить успехи Robocopy? - PullRequest
0 голосов
/ 21 декабря 2018

Я сделал индикатор выполнения с помощью tkinter.Я пытаюсь, чтобы индикатор выполнения следил за процессом копирования.Есть ли способ увидеть ход выполнения Robocopy и использовать его для индикатора выполнения?

Я знаю, что есть какое-то решение, вычисляющее размер исходного каталога и затем проверяющее размер целевого каталога.Это работает, но я не могу проверить, пропускается ли что-нибудь из robocopy, и тогда индикатор выполнения будет работать вечно.

Я использую этот код для robocopy:

subprocess.call(["robocopy", os.path.dirname(file_path), new_destination, filename[0], "/V", "/ETA", "/W:3", "/R:3",
                          "/TEE", "/LOG+:" +
                          new_destination + "copy.log"])

Я хочуобновить индикатор выполнения с выводом результатов Robocopy, если это возможно, а если это невозможно, способ проверить, завершена ли Robocopy.

Заранее спасибо!

1 Ответ

0 голосов
/ 24 декабря 2018

Сначала Когда я нажимаю кнопку и выбираю файлы / каталоги, которые хочу скопировать, я проверяю, в каком размере они все объединены.Я сохраняю это и устанавливаю максимальное значение индикатора выполнения в общий размер.Затем выполняется метод start_calc.

for item in self.file_and_directory_list:
            folder = ""
            my_file = ""
            if os.path.isdir(item):
                folder = item
            else:
                my_file = item

            if folder != "":
                print("folder")
                for (path, dirs, files) in os.walk(folder):
                    for file in files:
                        filename = os.path.join(path, file)
                        folder_size += os.path.getsize(filename)
            else:
                folder_size += os.path.getsize(item)

        if os.path.exists(new_destination):
            for (path, dirs, files) in os.walk(new_destination):
                for file in files:
                    filename = os.path.join(path, file)
                    folder_size += os.path.getsize(filename)

        processing_bar_copy_files["maximum"] = folder_size

        processing_bar_copy_files["value"] = 0

        threading.Thread(target=self.start_calc, args=(folder_size, new_destination)).start()   

Метод start_calc, где я вычисляю размер целевого каталога и проверяю, меньше ли он по сравнению с исходным каталогом.Если оно меньше, значение индикатора выполнения устанавливается равным размеру каталога назначения:

def start_calc(self, source_folder_size, new_destination):
    folder = new_destination
    dest_folder_size = 0

    try:
        for (path, dirs, files) in os.walk(folder):
            for file in files:
                filename = os.path.join(path, file)
                dest_folder_size += os.path.getsize(filename)
    except Exception as error:
        tkinter.messagebox.showerror(f"Er is iets fout gegaan:\n{error}")
    finally:
        if processing_bar_copy_files["value"] < processing_bar_copy_files["maximum"]:
            processing_bar_copy_files["value"] = dest_folder_size
            progress_percentage = (processing_bar_copy_files["value"] / processing_bar_copy_files["maximum"]) * 100
            progress_text_var.set(str("{:.1f}".format(progress_percentage) + "%"))
            self.size = dest_folder_size
            window.after(500, self.start_calc, source_folder_size, new_destination)

Если копирование файлов завершено, индикатор выполнения удаляется и останавливается, а кнопка возвращается.

...