126 lines
3.4 KiB
Python
126 lines
3.4 KiB
Python
import sqlite3
|
||
|
||
import psutil
|
||
|
||
|
||
def ScanSpecialVolumes(volume_letter):
|
||
"""
|
||
扫描指定的单个磁盘卷,返回其基本信息字典。
|
||
|
||
参数:
|
||
volume_letter: str,磁盘盘符(例如 "C", "Z")
|
||
|
||
返回:
|
||
dict: 包含 Path, Type, Option 字段的字典
|
||
"""
|
||
# 简单校验盘符格式(去除可能的冒号)
|
||
if len(volume_letter) >= 1 and volume_letter[-1] == ":":
|
||
volume_letter = volume_letter[:-1]
|
||
|
||
if not volume_letter or len(volume_letter) != 1 or not volume_letter.isalpha():
|
||
raise ValueError("无效的磁盘盘符,应为单个字母,如 'C' 或 'Z'")
|
||
|
||
return {
|
||
"Path": volume_letter.upper(),
|
||
"Type": "磁盘",
|
||
"Option": None
|
||
}
|
||
|
||
|
||
def ScanNTFSVolumes():
|
||
"""
|
||
扫描当前系统中所有 NTFS 格式的磁盘卷。
|
||
|
||
返回:
|
||
list of dict: 包含盘符等信息的字典列表
|
||
"""
|
||
ntfs_volumes = []
|
||
|
||
for partition in psutil.disk_partitions():
|
||
if partition.fstype.upper() == 'NTFS':
|
||
# 提取盘符(去掉冒号)
|
||
drive_letter = partition.device[0] if len(partition.device) >= 2 and partition.device[1] == ':' else None
|
||
if drive_letter:
|
||
ntfs_volumes.append({
|
||
"Path": drive_letter,
|
||
"Type": "磁盘",
|
||
"Option": None
|
||
})
|
||
|
||
return ntfs_volumes
|
||
|
||
|
||
def InsertVolumesToDB(data, db_path='../src/db_ntfs_info.db', table_name='db_device'):
|
||
"""
|
||
将 NTFS 磁盘信息写入数据库表,并防止重复插入。
|
||
|
||
参数:
|
||
data: list of dict,包含 Path, Type, Option 字段的数据
|
||
db_path: str,SQLite 数据库路径
|
||
table_name: str,目标表名
|
||
|
||
返回:
|
||
int: 成功插入的记录数
|
||
"""
|
||
conn = sqlite3.connect(db_path)
|
||
cursor = conn.cursor()
|
||
|
||
try:
|
||
# 创建表(如果不存在),并添加 Path 的唯一性约束
|
||
create_table_sql = f"""
|
||
CREATE TABLE IF NOT EXISTS {table_name} (
|
||
ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
Path TEXT NOT NULL UNIQUE,
|
||
Type TEXT NOT NULL CHECK(Type IN ('磁盘', '文件', '文件夹')),
|
||
Option TEXT
|
||
);
|
||
"""
|
||
cursor.execute(create_table_sql)
|
||
|
||
inserted_count = 0
|
||
insert_sql = f"""
|
||
INSERT OR IGNORE INTO {table_name} (Path, Type, Option)
|
||
VALUES (?, ?, ?)
|
||
"""
|
||
|
||
for item in data:
|
||
cursor.execute(insert_sql, (
|
||
item['Path'],
|
||
item['Type'],
|
||
item['Option']
|
||
))
|
||
if cursor.rowcount > 0:
|
||
inserted_count += 1
|
||
|
||
conn.commit()
|
||
print(f"✅ 成功插入 {inserted_count} 条 NTFS 磁盘信息")
|
||
return inserted_count
|
||
|
||
except Exception as e:
|
||
print(f"❌ 数据库操作失败: {e}")
|
||
conn.rollback()
|
||
return 0
|
||
|
||
finally:
|
||
conn.close()
|
||
|
||
|
||
def main():
|
||
# 扫描系统下所有 NTFS 磁盘
|
||
# volumes = ScanNTFSVolumes()
|
||
# print("🔍 找到以下 NTFS 磁盘:")
|
||
# for vol in volumes:
|
||
# print(vol)
|
||
#
|
||
# success_count = InsertVolumesToDB(volumes)
|
||
# print(f"共插入 {success_count} 条记录到数据库。")
|
||
|
||
# 扫描单个磁盘
|
||
volume_latter = "Z"
|
||
device_data = ScanSpecialVolumes(volume_latter)
|
||
InsertVolumesToDB([device_data])
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|