前言

现在这年头,AI 工具一堆,开发环境一堆,光是 VSCode、Node、Python、Docker 这些基本配置工具,再加上各种 AI 客户端的缓存,C 盘空间分分钟就见底了。

公司电脑就那么大点存储,C 盘一红,电脑卡得想打人,严重影响开发效率。

第一反应:删文件。但翻了一圈,AppDataLocal、各种缓存目录,好像都有用,不敢删。

第二反应:移到 D 盘。但直接移动的话,很多软件就不认路径了,得重新配置,麻烦。

后来发现了个神器:符号链接(Symbolic Link)

简单说就是:文件夹搬到 D 盘,但在 C 盘原位置留个"快捷方式",系统会自动把访问请求转到 D 盘。对软件来说,路径没变,完全无感。

道理懂了,但每次手动操作太麻烦。于是写了个小工具。(使用前可以先用其他磁盘工具如WinDirStat先看看哪些是大头文件)

工具长啥样

启动后自动打开,界面长这样:

┌─────────────────────────────────────────┐
│  磁盘文件夹迁移工具                      │
├─────────────────────────────────────────┤
│  源路径: [C:\Users\xxx\AppData\Local]  │
│  目标:   [D:\]                          │
│  实际迁移目标: D:\Local  ← 自动补全     │
│                                         │
│  [🚀 开始迁移]                          │
│                                         │
│  ████████████████░░░░░ 75.3%           │
│                                         │
│  日志输出:                              │
│  ─────────────────────────────          │
│  ✅ 迁移前检查通过                       │
│  📁 正在复制: Local\Temp\xxx.log       │
│  ...                                   │
└─────────────────────────────────────────┘

怎么用

diskTools工具点这里

最简单的方式:双击 run_as_admin.bat,会自动以管理员权限启动 Web 版,浏览器自动打开。

也可以手动运行:

cd src
python server.py --enhanced

浏览器会自动打开 http://127.0.0.1:8080

操作步骤

  1. 输入要迁移的文件夹路径(比如 C:\Users\Administrator\AppData\Local
  2. 输入目标路径(比如 D:\MigratedFolders
  3. 点"开始迁移"
  4. 等着就行,工具会自动:
    • 复制文件夹到目标位置
    • 在原位置创建符号链接
    • 如果符号链接失败,自动回滚

技术实现

符号链接创建

import os

# 把 source 文件夹移到 target,然后在 source 原位置创建链接
os.symlink(target, source)

就这么简单。但有几个坑:

坑1:需要管理员权限

Windows默认只有管理员才能创建符号链接。普通用户会报 privilege 错误。

所以工具启动时会检查权限,不够就自动请求提权。

坑2:不能跨盘符直接移动

shutil.move() 在跨盘符时会变成复制+删除,没有进度反馈。

当前实现:先遍历文件夹算总大小,然后一个个文件复制,实时更新进度。

def copy_folder_with_progress(source, target):
    total_size = get_folder_size(source)
    copied_size = 0
    
    for dirpath, dirnames, filenames in os.walk(source):
        for filename in filenames:
            src_file = os.path.join(dirpath, filename)
            # ... 复制文件 ...
            
            copied_size += os.path.getsize(src_file)
            percent = copied_size / total_size * 100
            # 更新进度条

坑3:符号链接失败要回滚

如果符号链接创建失败(比如权限问题),已经复制过去的文件就尴尬了。

所以加了回滚逻辑:失败就自动把文件移回来,保证不会丢数据。

try:
    os.symlink(target, source)
except OSError:
    # 符号链接失败,回滚
    shutil.move(target, source)

一些细节细节

路径自动补全:

输入目标路径时,如果填的是盘符根目录(如 E:\),界面会自动提示实际迁移目标(如 E:\test),不用每次都打完整路径。

进度显示:

大文件夹复制时能看到实时进度和当前正在复制的文件,不用干等着猜。

日志输出:

每一步操作都有日志,出问题能快速定位。

适合迁移哪些文件夹

亲测可以迁移的:

  • AppData\Local(各种缓存)
  • AppData\Roaming(部分软件数据)
  • Downloads(下载文件夹)
  • Documents(文档)
  • PicturesVideos(媒体文件)
  • 各种开发工具的缓存目录

不太建议迁移的:

  • Windows系统文件夹(别动)
  • 正在运行的程序目录(会报错)
  • 路径很短的文件夹(比如 C:\Temp,意义不大)## 写在最后最后

这个工具为初始版本,功能较单一。如果大家觉得有用,可以提issue或者PR,一起完善。
比如可以加的功能:

  • 多文件夹批量迁移
  • 迁移前后空间对比图
  • 预览模式(先看看会搬哪些文件)
  • 支持排除某些文件/文件夹

有问题欢迎评论区交流。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐