问题起因

作为 OneDrive 用户,我们可能都遇到这样的问题:

OneDrive 无法像 Google Drive 那样直接备份电脑上任意位置的文件夹。

OneDrive 默认只能同步存放在 OneDrive 目录内的文件,或者同步桌面、文档、图片、音乐、视频这些特定的文件夹。如果希望把 D:\Projects\Work 这样的位于电脑其他位置的任意文件夹也纳入同步,就必须要手动复制进 OneDrive 根目录中,这在很多情况下都不太方便。

而 Google Drive 提供了直观的“选择要同步的文件夹”功能,OneDrive 至今未支持。

⚠️注意:下文中,“假目录”“映射文件夹”“云目录”都是同一概念,都是对本地文件夹的符号链接。

解决方案

原理

既然 OneDrive 只能同步其目录内的文件,我们可以制造一个“假目录”,这个假目录实际链接到了电脑上的其他目录,例如 OneDrive 假目录的位置为 C:\Users\用户名\OneDrive\FakeDir,它链接到了 D:\Program Files\RealDir ,在 OneDrive 内点开这个 FakeDir 时,它实际上打开的是 D:\Program Files\RealDir

这个“假目录”既不是复制,也不是快捷方式,而是一个几乎无法区分的“镜像入口”,本质上是对真实目录的映射,类似于 Linux 中的软链接。

下载链接见本文末尾。

如何实现?

这可以通过 Windows 的符号链接(Symbolic Link)机制来实现。

在 Windows 系统中,mklink 是一个用于创建“符号链接”(Symbolic Link) 的命令行工具,mklink /D 命令可以创建目录级别的软链接,让一个目录映射到另一个位置。

优点:

  • OneDrive 以为你在它里面创建了一个子文件夹,实际上这个文件夹映射到了你电脑真正的文件夹。
  • 节省空间(因为不是复制)。

缺点:

  • 修改映射文件夹,不会立即触发同步!下文会讲解决方法。

示例命令:

# 语法: mklink /D "OneDrive目录" "本地目录"
mklink /D "D:\OneDrive\MyLink" "D:\Projects\MyApp"

这意味着,当你访问 MyLink 时,实际上是在访问 MyApp

如何取消同步?

删除 OneDrive 中的假目录,就自动解除了本地目录与 OneDrive 假目录的关联,本地目录还会保留,但是在 OneDrive 中该目录会被删除。

方法二:使用小工具便捷地创建符号链接并管理

原理

虽然 mklink 命令很好用,但每次还要用管理员权限打开 cmd 窗口手动执行命令,太麻烦。因此我用 Python + PyQt5 开发了一个图形化小工具,封装了这个命令,使符号链接的创建更便捷,并且可以方便地管理这些链接。

在这个小工具中,云目录即为“假目录”,它可以链接到任意一个你要备份的本地文件夹。

cf7b1ee9c5d233b7dccc88425aa25333.png

使用方法

请将本工具放在 OneDrive 根目录下运行!否则请看第一步。

  1. 启动工具,默认 OneDrive 根目录为该工具所在路径。⚠️如果你没有放在根目录下,请手动更改为根目录,否则后续操作无法正常进行。
  2. 选择你想要同步的本地目录 。
  3. 选择你希望放置在 OneDrive 中的位置 。
  4. 命名云目录名(也可以一键使用原目录名,这样更直观) ,然后创建云目录,工具会自动用 mklink 创建符号链接。
  5. 右侧列表会显示这台电脑当前在 OneDrive 中创建的所有云目录,方便管理。可双击打开目录或点击删除

⚠️ 如果你有多台电脑,每台电脑创建的云目录(映射文件夹)只在本机是“链接”状态,右侧列表也只会显示自己的云目录和本地目录对,而不会显示其他电脑的。其他电脑看到的是一个普通文件夹,因为它们没办法知道这个文件夹其实是链接过来的,在它们眼里,这只是 OneDrive 里同步过来的一个普通文件夹。

映射文件夹的内容发生变化后无法立即同步?

该部分来源:https://www.bilibili.com/opus/758807510390931577

由于我们在 OneDrive 中这样创建的文件夹是映射的文件夹,在原来的文件夹中我们执行任何的修改都是没法立刻同步到 OneDrive 的。

方法一

暂停 OneDrive 同步然后恢复同步,来进行刷新。

方法二

编写一个脚本来手动触发 OneDrive 同步。

创建一个 txt 文本文档,复制粘贴如下内容:

:: 创建一个带时间戳的空文件,触发 OneDrive 自动同步
@echo off
set prefix=OneDriveSyncFlag
set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
set "timestamp=%timestamp: =0%"  
del /f /q %prefix%*
type nul > %prefix%%timestamp%

将脚本名称更改为 OneDriveSync.bat,放在 OneDrive 目录内运行。

运行该脚本后,该脚本会自动在当前 OneDrive 目录下创建一个带有时间戳的空文件,触发 OneDrive 的自动同步。

下次运行该脚本,它会自动删除上次自己创建的空文件,再创建个新的。

两种方法各有使用场景,其实都差不多,都得手动。

但是你可以将脚本加入定时任务,自己设置每多久执行一次,这样就相当于定时自动同步了!

工具和脚本下载链接

蓝奏云:https://saikai.lanzoue.com/b00g37heyd
密码:fdwi