首页 > 解决方案 > 我需要将文件从 appdata/local 复制到 C 驱动器并在每次运行程序时覆盖它们

问题描述

我使用了一个程序,可悲的是,它会随机损坏一些保存的文件。为了提供帮助(尽管我是新手),我正在尝试制作一个 Python 程序来基本上从 AppData/local 目录中备份这些文件并将它们放在 C 上的文件夹中。我需要这个程序来覆盖以前复制的文件每次运行时。

我需要概括 AppData/local,因为理论上每个使用该程序的人在 AppData 文件夹之前都有一个不同的用户目录。

我已经尝试过自己的一些尝试来解决问题。我会发布结果。

# Imports

import shutil
import os
import distutils
from distutils import dir_util

# Paths

# os.makedirs("C:/RevSaves-Backup")
path = '%LOCALAPPDATA%/Remnant'
backup_path = "C:/RevSaves-Backup"

# Procedures

print("The Very Basic Remnant Save Backup Utility")
print(" ")
print("Backing up the save source:")
print(path)
print(" ")
print("It is recommended you run this at regular intervals \nto ensure you have the latest saves up to date.")

distutils.dir_util.copy_tree(path, backup_path)
print("Backup completed.")

当我通过命令提示符或 PowerShell 执行此操作时,我收到以下消息:

回溯(最后一次调用):文件“RevSaveBkUp.py”,第 28 行,在 distutils.dir_util.copy_tree(path, backup_path) 文件“C:\Users\candr\AppData\Local\Programs\Python\Python37-32\ lib\distutils\dir_util.py”,第 124 行,在 copy_tree “无法复制树 '%s': 不是目录”% src) distutils.errors.DistutilsFileError: 无法复制树 '%LOCALAPPDATA%/Remnant': 不是目录

我无法“定位”系统特定的本地 AppData 文件夹。

标签: python-3.x

解决方案


经过大量阅读,如果其他人试图做类似的事情,我提出了以下解决方案。但是,我不知道这是否是“最佳”或“正确”的做事方式。

无论用户登录如何,以下是我定位 AppData Local 文件夹的方法:

path = os.path.join(os.path.expanduser('~'), 'AppData', 'Local')

对于像我这样的新手的一些解释:

  • os.path.join基本上将路径中的文件夹连接在一起。例如,使用上面的代码,join 会将 AppData“连接”到本地和“用户文件夹”(在代码中引用为“~”)。输出如下所示:C:\Users\your_username\AppData\Local
  • os.path.expanduser定义有问题的用户。例如,“~”以当前登录用户为目标。它位于 () 内,因为这是您如何告诉“您的代码”以谁为目标的方式。如果你想要一个特定的用户(如果你有多个),我相信你可以使用 os.path.expanduser('Jane') 。

保留上面的注释作为参考,这种方法允许我定义我需要的变量并将它们用于上面的副本,我通常无法按照我的意愿使用 AppData 目录。

这是通过使用以下代码作为示例来完成的:

path = os.path.join(os.path.expanduser('~'), 'AppData', 'Local')
backup_path = "C:/MyBackupFolder"

最后我们执行了这个副本:

distutils.dir_util.copy_tree(path, backup_path)

上面复制了我需要的AppData信息到备份文件夹。

我希望这可以帮助每个人像我一样学习,它非常方便。


推荐阅读