Python Watchdog - ошибка MacOS -43 - как заставить скрипт ждать, пока папка не будет полностью перемещена в отслеживаемый каталог? - PullRequest
0 голосов
/ 31 марта 2020

Я довольно новичок в Python и пытаюсь написать скрипт, который помогает сортировать файлы, перемещая файлы в / sorted_folder с соответствующими каталогами расширений внутри. Звучит просто. Однако, если я хочу отсортировать папку (просто переместить ее в / sorted_folder), сценарий вылетает и на Ma c появляется сообщение об ошибке:

Error -43 "The operation can't be completed because one or more required items can't be found"

Вот код, который я написал :

origin_path = sys.argv[1] if len(
    sys.argv) > 1 else '/Users/macchester92/Desktop/Sorting Hat'
dest_path = '/Users/macchester92/Desktop/test_folder'

class SortingHatHandler(FileSystemEventHandler):
    def on_modified(self, event):
        for file in os.listdir(origin_path):
            move_file_to_destination_dir(file)

# actions to apply

def move_file_to_destination_dir(file):
    old_file_path = os.path.join(origin_path, file)
    if not file.startswith('.'):
        file_name, file_ext = os.path.splitext(file)
        result = check_folder(file_ext, file)
        return shutil.move(old_file_path, result)


def check_folder(file_ext, file):
    new_file_path = os.path.join(dest_path, file_ext[1:])
    if not os.path.exists(new_file_path):
        os.mkdir(new_file_path)
    final_path = os.path.join(new_file_path, file)

    if not final_path:
        os.mkdir(final_path)
    return final_path

# configuring the app

observer = Observer()
event_handler = SortingHatHandler()
observer.schedule(event_handler, origin_path, recursive=True)

observer.start()
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()
observer.join()

Наблюдая за поведением скрипта, я заметил, что, когда вы пытаетесь отсортировать папку, Сортировщик не ждет полного ее копирования и сразу же инициирует перемещение в папку назначения. В результате macOS не может завершить sh копирование папки, папка перемещается в папку назначения и помечается как «поврежденная», следовательно, она неактивна.

Быстрое решение - установить таймер для папки. В некоторой степени это помогает, но я чувствую, что это осквернение ...

def on_modified(self, event):
    for file in os.listdir(origin_path):

        #resolves error -43 when directory is partially moved to the sorting folder
        if os.path.isdir(file):
            time.sleep(10)

        move_file_to_destination_dir(file)

Другое решение, которое я нашел в SO, заключалось в проверке размера файла перед сортировкой. Это совершенно нормально для файлов, но не работает для папок. Вот код:

class SortingHatHandler(FileSystemEventHandler):
    def on_modified(self, event):
        for file in os.listdir(origin_path):
            file_size = -1
            event_path = os.path.join(origin_path, file)
            while file_size != os.path.getsize(event_path):
                file_size = os.path.getsize(event_path)
                time.sleep(1)
            move_file_to_destination_dir(file)

У кого-нибудь есть идеи, как заставить скрипт ждать, пока папка не будет скопирована в наблюдаемую папку сторожевого таймера, прежде чем переместить его в конечную папку назначения? Заранее спасибо.

Partially moved folder, due to error -43 exception

...