Я довольно новичок в 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](https://i.stack.imgur.com/tBRc4.jpg)