簡體   English   中英

Shutil.move 內部遞歸 function

[英]Shutil.move inside a recursive function

我寫這個 function 是為了在移動文件和目錄時實現與 Windows 類似的行為。 特別是,對象應該被覆蓋。

from pathlib import Path
import shutil
import os


def move_anyhow(source: Path | str, dest: Path | str) -> Path:
    """
    Move source (directory or file) and overwrite files with same name in dest if exists.
    """
    try:
        shutil.move(source, dest)
    except shutil.Error:
        if source.is_file():
            shutil.move(source, dest / source.name)
        else:
            for path in source.iterdir():
                move_anyhow(path, dest / source.name)
            os.rmdir(source)
    return dest / source.name

我采用了一種遞歸的方法來移動嵌套的源目錄,就像這樣

.../source/

dir_A/
  dir_B/
    file_X

到目的地

.../dest/

dir_A/
  dir_B/
    file_X
    file_Y

在生產中,我時不時會收到一個 PermissionError,如下所示:

PermissionError: [Errno 13] Permission denied: '/delivery/post/01_FROM_CF/W22_FW/50479944_003' -> '/delivery/post/01_FROM_CF/ERROR/W22_FW/50479944_003'
  File "shutil.py", line 813, in move
    os.rename(src, real_dst)

OSError: [Errno 39] Directory not empty: '/delivery/post/01_FROM_CF/W22_FW/50479944_003'
  File "ors/path.py", line 34, in move_anyhow
    shutil.move(source, dest)
  File "shutil.py", line 831, in move
    rmtree(src)
  File "shutil.py", line 728, in rmtree
    onerror(os.rmdir, path, sys.exc_info())
  File "shutil.py", line 726, in rmtree
    os.rmdir(path)

所有文件都已移動,但保留了空的源文件夾。 我無法在本地重現此錯誤。 所以我的第一個猜測是這是一個服務器問題。 不過,我想知道嵌套方法是否會導致此錯誤。

所以我想我的問題是捕獲的 shutil.move 錯誤是否可以阻止源目錄中文件的另一個 shutil.move 操作。

問題可能出在文件刪除和目錄刪除的時間上。 我會嘗試取消立即刪除目錄,我只會在最后刪除目錄。

刪除命令行:

os.rmdir(source)

當文件傳輸完成后,調用命令

shutil.rmtree(source)

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM