开始只是想集中备份所有apple设备上的照片,后来发现windows上各种方式都比较麻烦。事实证明只有icloud才是唯一一种可以持续保持手机备份更新的途径。因为云上贵州的原因,现在下载速度基本不是问题了。
我有四万七千张照片,别问我为啥有那么多照片,手机更新了,但是每次都是恢复以前的一切,但是照片庞大到传统的各种导出很无力,特别是使用了icloud也是。这里icloud一定要用微软商店中的版本,老版本就是有个安装包的那个可以点击下载所有文件,问题是不会自动下载最新的,然后下载还容易中断。最新版本会再本地出现一个icloud挂载文件夹,也是windows10最新支持的,出于备份的目的我需要有的不仅仅是镜像而是真正的下载我的拷贝。可以右击资源管理器中的icloud标识选择“Always keep on this device”,他就会自动下载所有文件。
还好我开始准备这件事,已经发现了数个文件和照片不可恢复!!!
2020年12月18日更新:这个选项的变更只是增加了本地的照片,长久不用后还是会缩小占用的空间,也就是说很多还是会白下载。最终的解决的办法是写了个脚本把icloud下的文件全部拷贝到另一个不受监控的目录,这里我使用了win32api,拷贝这个东西吃过两次亏,一次是默认的拷贝居然是链接我养成了查看实际占用磁盘大小的习惯;第二次拷贝丢失了exif,对于照片来说这个exif等附加信息还是很重要的,而最佳的保存办法就是调用系统自己的copy就是win32api了。
import threading
import os, time, threading
from tqdm import tqdm
from pathlib import Path
from multiprocessing import Pool, cpu_count
from tqdm.contrib.concurrent import process_map
import win32file
total_file_size = 0
lock = threading.Lock()
base_dir = Path('xxxx')
des_dir = Path('xxxx')
file_names = os.listdir(str(base_dir))
pbar = tqdm(total=len(file_names))
def try_open(file_name):
# print('opening at %s:\t\n' % str(time.strftime('%H:%M:%S', time.localtime())) + str(file_path))
start_time = time.time()
global pbar
source_path = os.path.join(str(base_dir), file_name)
des_path = os.path.join(str(des_dir), file_name)
if not os.path.exists(des_path):
# 拷文件
# 文件已存在时,1为不覆盖,0为覆盖
win32file.CopyFile(source_path, des_path, 1)
pbar.update(1)
if __name__ == '__main__':
start_time = time.time()
r = process_map(try_open, file_names, max_workers=5)
# with Pool(cpu_count()-2) as pool:
# pool.map(try_open, files)
print("--- %s seconds at %s---" % (time.time() - start_time, time.strftime('%H:%M:%S', time.localtime())))
# s1=os.stat(os.path.join(str(basepath),'12715.mp4'))
# print(s1)
# s2=os.stat(os.path.join(str(basepath),'438.mp4'))
# print(s2)