基于python的u盘自动拷贝工具

0x00 需要用到的库

  • OS:OS库提供了使用各种操作系统功能的接口。主要有对目录或者文件的新建,删除,查看文件属性,还提供了对文件以及目录的路径操作。
  • shutil:对文件提供了移动,复制,打包,压缩等功能,这里主要用到复制功能。
  • time: 时间处理的库,在这里用来程序休眠的时间。

0x01 程序设计思路

我们需要每隔一段时间检查是否有u盘插入,如果检测到有u盘,则将u盘的内容全部拷贝到本机的指定文件夹。

0x02 最简单模式编程实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os
import time
import shutil
USB = 'D:\\' # u盘目录
SAVE = 'C:\\Users\Leticia\Desktop\copy' # 保存目录
def usbcopy():
shutil.copytree(USB, SAVE)
def main():
while (1):
if os.path.exists(USB):
usbcopy()
time.sleep(200) # 休眠时间
main()

此程序中,USB变量是u盘目录,根据个人电脑来填写,SAVE变量是将拷贝出来的文件保存的目录,time.sleep(200)代表每次判断完之后休眠200秒。
此时测试程序已经可以自动拷贝了,但是还存在一些问题,比如我们已经拷贝完成了,然后休眠完成之后u盘没有拔,这个时候会重新复制一遍。但是我们如果写成检测到u盘,拷贝一遍程序就停止运行,那么u盘内容发生变化我们要怎么做,所以我们还要加几个功能。

0x03 增加检测变化模块的编程实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import os
import time
import shutil
from os.path import join,getsize
USB = 'D:\\' # u盘目录
SAVE = 'C:\\Users\Leticia\Desktop\copy' # 保存目录
def getdirsize(dir):
size=0
for root,dirs,files in os.walk(dir):
size+=sum([getsize(join(root,name)) for name in files])
print(size)
return size
def usbcopy():
shutil.copytree(USB, SAVE)
def main():
old_dirsize = 0
new_dirsize = 0
while (1):
if os.path.exists(USB):
print("检测到U盘")
new_dirsize = getdirsize(USB)
if old_dirsize != new_dirsize:
usbcopy()
old_dirsize = new_dirsize
else:
print("没有变化")
else:
print("暂时没有U盘")
print("开始休眠")
time.sleep(5) # 休眠时间
print("休眠结束")
main()

这里我们新加了一个getdirsize函数来遍历u盘文件并统计总大小,然后如果总大小改变,则拷贝,如果没变,就不重新拷贝。
这样就解决了文件更新的问题,根据下图print的提示我们可以看到大概的工作流程。

0x04 其他

此时我们的代码可以运行了,但是如果我们拿到其他人电脑里,因为python环境等问题很大可能无法执行,所以我们可以借助前面一篇博客说过的 http://uuzdaisuki.com/2017/05/11/%E4%BD%BF%E7%94%A8python-pyinstaller%E6%89%93%E5%8C%85python%E7%A8%8B%E5%BA%8F%E4%B8%BAexe/ 将python程序打包成exe在其他电脑中使用。

如果这样还觉得不方便的话,在这里再提供一个vbs的拷贝小脚本,同样能达到我们的功能,在txt中输入如下代码,然后根据个人路径稍作更改,然后讲后缀改成vbs,双击运行,就可以在后台自动拷贝了。

1
2
3
4
5
6
7
8
9
10
11
set fso=createobject("scripting.filesystemobject")
set ws=createobject("wscript.shell")
on error resume next
do
wscript.sleep 1000
if fso.driveexists("D:") then
fso.copyfile "D:*","C:\Users\Leticia\Desktop\copy"
fso.copyfolder "D:*","C:\Users\Leticia\Desktop\copy"
wscript.sleep 20000
end if
loop