yemanet 发表于 6 天前

[东西很实用]给大家分享一个可以复制桌面文件到其他盘的代码

本帖最后由 yemanet 于 2025-11-13 21:52 编辑

                                                                               给大家分享一个可以复制桌面文件到其他盘的代码
                                                                                          希望高手让代码更加完美!
                     备份桌面文件的代码。自己可以修改




import shutil
import os
from datetime import datetime


# 源目录和目标目录路径
source_dir = 'C://Users//Administrator//Desktop'
target_dir = 'D:\\target_folder'
# 确保目标目录存在,如果不存在则创建
os.makedirs(target_dir, exist_ok=True)
def rename_directory_if_exists(base_dir, target_dir_name):
    # 检查目录是否存在
    full_path = os.path.join(base_dir, target_dir_name)
    if os.path.exists(full_path) and os.path.isdir(full_path):
      # 获取当前时间,格式化为字符串
      current_time = datetime.now().strftime("%Y%m%d%H%M%S")
      # 生成新的目录名
      new_dir_name = f"{target_dir_name}_{current_time}"
      new_full_path = os.path.join(base_dir, new_dir_name)
      # 重命名目录
      os.rename(full_path, new_full_path)


      print(f"目录已重命名为: {new_full_path}")

      try:
   
            print(f'Directory {source_dir} copied to {target_dir}')
            print("这个执行了吗?")
      except Exception as e:
            print(f'Failed to copy directory: {e}')

FishC 发表于 6 天前

您好!感谢分享您的代码。我注意到代码的逻辑有些问题,主要是复制操作只在目录存在时才执行,这可能导致备份失败。下面是一个改进版本,修复了逻辑问题并增强了错误处理。


import shutil
import os
from datetime import datetime

# 源目录和目标目录路径(可根据需要修改)
source_dir = 'C://Users//Administrator//Desktop'
target_dir = 'D:\\target_folder'

# 确保目标目录存在
os.makedirs(target_dir, exist_ok=True)

def rename_directory_if_exists(base_dir, target_dir_name):
    full_path = os.path.join(base_dir, target_dir_name)
    if os.path.exists(full_path) and os.path.isdir(full_path):
      current_time = datetime.now().strftime("%Y%m%d%H%M%S")
      new_dir_name = f"{target_dir_name}_{current_time}"
      new_full_path = os.path.join(base_dir, new_dir_name)
      try:
            os.rename(full_path, new_full_path)
            print(f"目录已重命名为: {new_full_path}")
      except Exception as e:
            print(f"重命名失败: {e}")
    else:
      print(f"目录 {full_path} 不存在,无需重命名。")

# 先重命名目标目录(如果存在)
rename_directory_if_exists(target_dir, "Desktop")

# 然后复制源目录到目标目录
try:
    shutil.copytree(source_dir, os.path.join(target_dir, "Desktop"))
    print(f"目录 {source_dir} 已成功复制到 {os.path.join(target_dir, 'Desktop')}")
except Exception as e:
    print(f"复制失败: {e}")


改进说明:
- 修复了复制逻辑:现在无论目标目录是否存在,都会尝试复制。
- 增强了错误处理:重命名和复制操作都添加了异常捕获。
- 简化了代码结构:将重命名和复制分开,提高可读性。

您可以根据需要调整路径或添加更多功能,例如备份前确认或日志记录。如果有其他问题,欢迎继续交流!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

yemanet 发表于 5 天前

FishC 发表于 2025-11-13 21:45
您好!感谢分享您的代码。我注意到代码的逻辑有些问题,主要是复制操作只在目录存在时才执行,这可能导致备 ...

如果我在这个文件夹下创建一个Desktop的文件,运行就会报错的,呵呵!小甲鱼老师该如何应对呢????

程序就会报错的!咋要考虑各种问题的。测试过报错复制不了?

FishC 发表于 5 天前

yemanet 发表于 2025-11-14 17:46
FishC 发表于 2025-11-13 21:45
您好!感谢分享您的 ...

您说得非常对!如果目标目录下已经存在一个名为 "Desktop" 的文件(而不是文件夹),代码确实会报错。这是因为 shutil.copytree() 要求目标路径必须不存在或是一个空目录。

下面是一个改进版本,可以处理目标路径下可能存在的文件或文件夹:


import shutil
import os
from datetime import datetime

# 源目录和目标目录路径(可根据需要修改)
source_dir = 'C://Users//Administrator//Desktop'
target_base_dir = 'D:\\target_folder'

# 确保目标基目录存在
os.makedirs(target_base_dir, exist_ok=True)

def rename_if_exists(path):
    """
    如果指定路径存在(无论是文件还是文件夹),则重命名它
    """
    if os.path.exists(path):
      # 获取路径的目录和基名
      dir_name = os.path.dirname(path)
      base_name = os.path.basename(path)
      current_time = datetime.now().strftime("%Y%m%d%H%M%S")
      new_base_name = f"{base_name}_{current_time}"
      new_path = os.path.join(dir_name, new_base_name)
      
      try:
            os.rename(path, new_path)
            print(f"路径已重命名为: {new_path}")
            return True
      except Exception as e:
            print(f"重命名失败: {e}")
            return False
    return True# 路径不存在,无需处理

# 目标路径
target_path = os.path.join(target_base_dir, "Desktop")

# 先重命名目标路径(如果存在)
if rename_if_exists(target_path):
    # 然后复制源目录到目标路径
    try:
      shutil.copytree(source_dir, target_path)
      print(f"目录 {source_dir} 已成功复制到 {target_path}")
    except FileNotFoundError:
      print(f"错误: 源目录 {source_dir} 不存在")
    except Exception as e:
      print(f"复制失败: {e}")
else:
    print("无法继续执行,因为重命名操作失败")


改进说明:
- 新增了 rename_if_exists() 函数,可以处理任何类型的路径(文件或文件夹)
- 在复制前先检查并重命名目标路径,确保复制操作不会因路径冲突而失败
- 添加了更详细的错误处理,包括源目录不存在的特殊情况
- 函数返回布尔值以指示操作状态,便于后续逻辑判断

这个版本应该能解决您提到的问题。如果目标路径下存在 "Desktop" 文件,程序会先将其重命名(如 "Desktop_20251113215230"),然后再执行复制操作。

感谢您的反馈,这让代码更加健壮!如果还有其他边界情况,欢迎继续讨论。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

yemanet 发表于 4 天前

感谢 小甲鱼老师的迅速处理!

FishC 发表于 4 天前

yemanet 发表于 2025-11-15 18:49
感谢 小甲鱼老师的迅速处理!

不客气!很高兴能帮到您。编程就是这样,通过不断发现问题和解决问题,我们的代码会变得越来越健壮。

如果您在使用过程中遇到任何其他问题,或者想要添加新功能(比如选择性备份、进度显示等),随时欢迎继续交流!

祝您编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

yemanet 发表于 3 天前

进度条,多线程,还有 图形界面都有再练习中学习。感谢小甲鱼老师的指正

FishC 发表于 3 天前

yemanet 发表于 2025-11-16 13:31
进度条,多线程,还有 图形界面都有再练习中学习。感 ...

您太客气了!这些都是很好的学习方向:


[*]进度条:可以使用 tqdm 库,非常适合文件操作
[*]多线程:对于大量文件复制很有帮助,但要注意线程安全
[*]图形界面:tkinter 是 Python 自带的,学习曲线平缓


这些功能组合起来确实能让程序更加实用和友好。学习编程就是这样,从一个简单的需求出发,逐步添加功能,在实践中不断提升。

期待看到您更完善的版本!如果在实现过程中遇到问题,随时欢迎回来交流。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: [东西很实用]给大家分享一个可以复制桌面文件到其他盘的代码