如何跨驱动器对只读文件进行 `shutil.move`
how to `shutil.move` with readonly files across drives
至少在 windows、shutil.move
上,包含只读文件的文件夹到另一个驱动器将失败。它失败了,因为 move
是通过 copy
后跟 rmtree
实现的。最后,是 rmtree
试图删除不可写文件。
目前我通过首先为所有(嵌套)文件设置 stat.S_IWUSER
来解决这个问题,但现在我仍然应该在之后恢复原始 stat
:
def make_tree_writable(source_dir):
for root, dirs, files in os.walk(source_dir):
for name in files:
make_writable(path.join(root, name))
def make_writable(path_):
os.chmod(path_, stat.S_IWUSR)
def movetree_workaround(source_dir, target_dir):
make_tree_writable(source_dir)
shutil.move(source_dir, target_dir)
所以我想知道:是这样吗?我可以使用正在制作的 shutil2
吗?我能帮忙吗?
您可以分两步完成:首先,使用 shutil.copytree()
复制具有适当权限的完整目录和文件结构。然后您可以更改源的权限以确保您有权删除内容,并使用 shutil.rmtree()
删除旧源。
至少在 windows、shutil.move
上,包含只读文件的文件夹到另一个驱动器将失败。它失败了,因为 move
是通过 copy
后跟 rmtree
实现的。最后,是 rmtree
试图删除不可写文件。
目前我通过首先为所有(嵌套)文件设置 stat.S_IWUSER
来解决这个问题,但现在我仍然应该在之后恢复原始 stat
:
def make_tree_writable(source_dir):
for root, dirs, files in os.walk(source_dir):
for name in files:
make_writable(path.join(root, name))
def make_writable(path_):
os.chmod(path_, stat.S_IWUSR)
def movetree_workaround(source_dir, target_dir):
make_tree_writable(source_dir)
shutil.move(source_dir, target_dir)
所以我想知道:是这样吗?我可以使用正在制作的 shutil2
吗?我能帮忙吗?
您可以分两步完成:首先,使用 shutil.copytree()
复制具有适当权限的完整目录和文件结构。然后您可以更改源的权限以确保您有权删除内容,并使用 shutil.rmtree()
删除旧源。