远程文件管理及操作工具

news/2024/9/23 20:38:09/
项目背景

能够管理本地和远程文件(例如通过网络共享路径)并执行常见操作的工具。这些操作包括文件复制、剪切、删除等,且操作后能动态更新用户界面中显示的文件系统。项目中需要使用 QTreeView 作为文件浏览的界面,通过多线程处理文件操作任务,并从配置文件中读取管理路径。

在这里插入图片描述

项目功能概述
  1. 文件及文件夹管理:通过 QTreeView 显示目录结构,递归遍历文件夹,并能进行操作后自动刷新。
  2. 多线程文件操作:为每个文件操作(复制、剪切、删除)创建了专门的线程,避免主线程阻塞。
  3. 配置文件读取:支持从 config.ini 中读取配置文件来获取需要管理的文件路径,支持网络共享路径和本地路径。
  4. 操作反馈:在执行文件操作时,使用信号-槽机制向用户界面反馈操作进度。
  5. 灵活性:通过添加根目录的机制,保持目标路径结构与源路径一致。
    在这里插入图片描述
关键功能说明
1. 配置文件读取

项目需要从配置文件 config.ini 读取路径信息。以下是 config.ini 文件的示例结构:

[operpath]
1\val="E:\\Qice Images"
2\val="//DESKTOP-IU21M5R//Qice Images"

我们通过 QSettings 读取配置文件中的每个路径,并返回管理路径的列表。

关键代码

#include <QSettings>
#include <QStringList>QStringList getOperPaths(const QString &configFilePath = "config.ini") {QSettings settings(configFilePath, QSettings::IniFormat);settings.beginGroup("operpath");QStringList operPaths;QStringList groups = settings.childGroups();foreach (const QString &group, groups) {settings.beginGroup(group);QString path = settings.value("val").toString();operPaths << path;settings.endGroup();}settings.endGroup();return operPaths;
}
2. 递归加载文件目录到 QTreeView

为了展示文件系统结构,项目中递归遍历给定的文件路径,并将其加载到 QTreeView 中。该函数每次都会递归进入子目录,加载所有文件夹和文件。

关键代码

void MainWindow::populateFileList(const QStringList &initialDirPaths) {model->clear();  // 清除现有数据foreach (QString path, initialDirPaths) {QDir dir(path);if (!dir.exists()) {continue;}QStandardItem *rootItem = new QStandardItem(dir.dirName());rootItem->setData(path, Qt::UserRole);model->invisibleRootItem()->appendRow(rootItem);findFilesInDirectories(path, rootItem);  // 递归加载文件}ui->treeView->expandAll();  // 展开所有节点
}void MainWindow::findFilesInDirectories(const QString &dirPath, QStandardItem *parentItem) {QDir dir(dirPath);QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);foreach (QFileInfo fileInfo, list) {QStandardItem *item = new QStandardItem(fileInfo.fileName());item->setData(fileInfo.absoluteFilePath(), Qt::UserRole);parentItem->appendRow(item);if (fileInfo.isDir()) {findFilesInDirectories(fileInfo.absoluteFilePath(), item);  // 递归进入子目录}}
}
3. 多线程文件操作(复制、剪切、删除)

文件操作任务(如复制、剪切、删除)是耗时的,因此使用了 QThread 来处理这些操作。每个操作完成后会触发信号,通知主线程进行刷新。

关键代码

void ImageMoverThread::run() {if (rootPath.isEmpty()) {emit progress(0, tc("源路径为空"));return;}QDir dir(rootPath);if (!dir.exists()) {emit progress(0, tc("源路径不存在"));return;}if (m_operationType == Copy || m_operationType == Cut) {if (targetPath.isEmpty()) {emit progress(0, tc("目标路径为空"));return;}QString rootFolderName = QDir(rootPath).dirName();QString targetRootPath = targetPath + "/" + rootFolderName;if (!QDir(targetRootPath).exists()) {if (!QDir().mkdir(targetRootPath)) {emit progress(0, tc("无法创建目标根目录文件夹"));return;}}processDirectory(rootPath, targetRootPath);  // 递归处理复制/剪切if (m_operationType == Cut) {deleteDirectory(rootPath);  // 剪切操作后删除源文件}} else if (m_operationType == Delete) {deleteDirectory(rootPath);  // 删除操作}emit operationCompleted();  // 操作完成,发出信号刷新视图
}
4. 删除操作

删除操作会递归删除文件夹中的文件,但保留文件夹本身。

关键代码

void ImageMoverThread::deleteDirectory(const QString &dirPath) {QDir dir(dirPath);QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);foreach (QFileInfo fileInfo, list) {if (fileInfo.isDir()) {deleteDirectory(fileInfo.absoluteFilePath());  // 递归处理子文件夹} else {if (!QFile::remove(fileInfo.absoluteFilePath())) {emit progress(0, tc("删除文件失败: ") + fileInfo.fileName());}}}emit progress(100, tc("目录已清理文件: ") + dirPath);
}
5. 刷新 QTreeView

当文件操作完成后,触发刷新文件树结构的操作,以便显示最新的文件状态。

关键代码

void MainWindow::refreshTreeView() {QStringList paths = getOperPaths();  // 重新获取管理路径populateFileList(paths);  // 重新填充文件树
}

http://www.ppmy.cn/news/1529482.html

相关文章

Fyne ( go跨平台GUI )中文文档- 架构 (八)完结

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

Java基础-零拷贝

文章目录 什么是零拷贝&#xff1f;传统IO执行过程零拷贝的意义零拷贝的主要实现方式实际应用场景零拷贝的优势零拷贝的局限性 Java 中的零拷贝实现FileChannel.transferTo()FileChannel.transferFrom() 相关知识点解释什么是DMA内核空间和用户空间什么是用户态、内核态什么是上…

jenkins 部署到tomcat

将 Jenkins 部署到 Tomcat 需要将 Jenkins 的 WAR 文件部署到 Tomcat 中。以下是详细步骤&#xff1a; 1. 准备环境 确保你已经安装了 Tomcat 并且 Tomcat 服务正在运行。你可以使用 apt-get 安装 Tomcat&#xff0c;如下所示&#xff08;以 Tomcat 9 为例&#xff09;&#…

在excel中使用python?

是的&#xff01;excel中可以使用python了&#xff01; 在去年8月22日&#xff0c;微软通过官方博客发布将与anaconda展开合作&#xff0c;简而言之就是excel将支持python&#xff0c;可以在表格中直接利用python就行数据分析&#xff0c;可以在表格中直接运行python了。 如何…

VulnHub-Bilu_b0x靶机笔记

Bilu_b0x 靶机 概述 Vulnhub 的一个靶机&#xff0c;包含了 sql 注入&#xff0c;文件包含&#xff0c;代码审计&#xff0c;内核提权。整体也是比较简单的内容&#xff0c;和大家一起学习 Billu_b0x.zip 靶机地址&#xff1a; https://pan.baidu.com/s/1VWazR7tpm2xJZIGUS…

7.Jmeter数据驱动(csv数据文件设置)+Jmeter数据库操作

一、Jmeter数据驱动 因为&#xff1a;工作中&#xff0c;有些公司一个接口就是一个吻用例&#xff0c;另外一些公司一个接口有几十个用例&#xff0c;就需要用到数据驱动。 特别注意&#xff1a;断言&#xff0c;如果有共同字段&#xff0c;那么就用json断言&#xff0c;如果没…

Git提交类型

说明&#xff1a;Git提交类型指的是代码commit时&#xff0c;写在comment前面的标志&#xff0c;表示此次commit的提交类型&#xff0c;如下&#xff1a; Git提交类型 常见的Git提交类型有&#xff1a; feat&#xff1a;新特性、新功能或优化&#xff1b; fix&#xff1a;修复…

SpringBoot开发——整合Apache POI轻松生成精美的Excel报表

文章目录 1、准备工作2、编写代码2.1 创建实体类2.2 创建Excel生成服务2.3 创建控制器 3、测试4、结论 在许多企业应用程序中&#xff0c;导出数据到Excel表格是一项常见的需求。Spring Boot提供了许多库来简化这个过程&#xff0c;其中包括Apache POI和Spring Boot的相关模块。…