fix 23
This commit is contained in:
@@ -37,7 +37,7 @@ class MainWindow(QMainWindow):
|
||||
self.system_manager = SystemInfoManager()
|
||||
self.disk_ops = DiskOperations(self.system_manager)
|
||||
self.raid_ops = RaidOperations()
|
||||
self.lvm_ops = LvmOperations()
|
||||
self.lvm_ops = LvmOperations() # LvmOperations 包含通用的 _execute_shell_command
|
||||
|
||||
# 连接刷新按钮的信号到槽函数
|
||||
if hasattr(self.ui, 'refreshButton'):
|
||||
@@ -149,6 +149,10 @@ class MainWindow(QMainWindow):
|
||||
if device_type == 'disk':
|
||||
create_partition_action = menu.addAction(f"创建分区 {device_path}...")
|
||||
create_partition_action.triggered.connect(lambda: self._handle_create_partition(device_path, dev_data))
|
||||
# --- 新增功能:擦除分区表 ---
|
||||
wipe_action = menu.addAction(f"擦除分区表 {device_path}...")
|
||||
wipe_action.triggered.connect(lambda: self._handle_wipe_partition_table(device_path))
|
||||
# --- 新增功能结束 ---
|
||||
menu.addSeparator()
|
||||
|
||||
if device_type == 'part':
|
||||
@@ -171,6 +175,39 @@ class MainWindow(QMainWindow):
|
||||
else:
|
||||
logger.info("右键点击了空白区域或设备没有可用的操作。")
|
||||
|
||||
# --- 新增方法:处理擦除分区表 ---
|
||||
def _handle_wipe_partition_table(self, device_path):
|
||||
"""
|
||||
处理擦除物理盘分区表的操作。
|
||||
"""
|
||||
reply = QMessageBox.question(
|
||||
self,
|
||||
"确认擦除分区表",
|
||||
f"您确定要擦除设备 {device_path} 上的所有分区表吗?\n"
|
||||
f"**此操作将永久删除设备上的所有分区和数据,且不可恢复!**\n"
|
||||
f"请谨慎操作!",
|
||||
QMessageBox.Yes | QMessageBox.No,
|
||||
QMessageBox.No
|
||||
)
|
||||
if reply == QMessageBox.No:
|
||||
logger.info(f"用户取消了擦除 {device_path} 分区表的操作。")
|
||||
return
|
||||
|
||||
logger.warning(f"尝试擦除 {device_path} 上的分区表。")
|
||||
# 使用 LvmOperations 中通用的 _execute_shell_command 来执行 parted 命令
|
||||
success, _, stderr = self.lvm_ops._execute_shell_command(
|
||||
["parted", "-s", device_path, "mklabel", "gpt"], # 默认使用 gpt 分区表类型
|
||||
f"擦除 {device_path} 上的分区表失败"
|
||||
)
|
||||
|
||||
if success:
|
||||
QMessageBox.information(self, "成功", f"设备 {device_path} 上的分区表已成功擦除。")
|
||||
self.refresh_all_info()
|
||||
else:
|
||||
# 错误信息已由 _execute_shell_command 处理并显示
|
||||
pass
|
||||
# --- 新增方法结束 ---
|
||||
|
||||
def _handle_create_partition(self, disk_path, dev_data):
|
||||
total_disk_mib = 0.0
|
||||
total_size_str = dev_data.get('size')
|
||||
@@ -208,6 +245,7 @@ class MainWindow(QMainWindow):
|
||||
|
||||
if dev_data.get('children'):
|
||||
logger.debug(f"磁盘 {disk_path} 存在现有分区,尝试计算下一个分区起始位置。")
|
||||
# 假设 disk_ops.get_disk_free_space_info_mib 能够正确处理
|
||||
calculated_start_mib, largest_free_space_mib = self.disk_ops.get_disk_free_space_info_mib(disk_path, total_disk_mib)
|
||||
if calculated_start_mib is None or largest_free_space_mib is None:
|
||||
QMessageBox.critical(self, "错误", f"无法确定磁盘 {disk_path} 的分区起始位置。")
|
||||
@@ -218,9 +256,9 @@ class MainWindow(QMainWindow):
|
||||
max_available_mib = 0.0
|
||||
else:
|
||||
logger.debug(f"磁盘 {disk_path} 没有现有分区,假定从 0 MiB 开始,最大可用空间为整个磁盘。")
|
||||
max_available_mib = max(0.0, total_disk_mib - 1.0)
|
||||
start_position_mib = 1.0
|
||||
logger.debug(f"磁盘 /dev/sdd 没有现有分区,假定从 {start_position_mib} MiB 开始,最大可用空间为 {max_available_mib} MiB。")
|
||||
max_available_mib = max(0.0, total_disk_mib - 1.0) # 留一点空间,避免边界问题
|
||||
start_position_mib = 1.0 # 现代分区表通常从1MB或更大偏移开始
|
||||
logger.debug(f"磁盘 {disk_path} 没有现有分区,假定从 {start_position_mib} MiB 开始,最大可用空间为 {max_available_mib} MiB。")
|
||||
|
||||
dialog = CreatePartitionDialog(self, disk_path, total_disk_mib, max_available_mib)
|
||||
if dialog.exec() == QDialog.Accepted:
|
||||
|
||||
Reference in New Issue
Block a user