Qt开发 之 删除文件或文件夹到回收站(详解)
文章目录
- 1、简介
- 1.1、问题描述
- 1.2、解决方案
- 2、源代码
- 2.1、WinAPI调用
- 2.2、两行代码解决Release版本根目录驱动问题
- 2.3、解决部分文件删除不成功的问题
- 3、QFileInfo官方说明
- 4、Qt 5.15版本的功能
1、简介
写这篇文章之前,已经看过很多类似的文章,都没有实质性的解决这个问题。
1.1、问题描述
原本程序在main函数中直接调用WinAPI删除文件或者文件夹到回收站,无论在Debug版本还是Release版本都不会有问题。但是如果封装成函数或者类,在栈中或者堆中去执行的时候,Release版本的驱动器根目录下就会必然不成功。
1.2、解决方案
看了Windows回收站的工作原理,才知道文件或者文件夹在删除到回收站时,实际上并没有被删除而是从所在目录更改到所在磁盘的Recycled文件夹。Recycled这个文件夹实际上是不公开的,可以通过更改计算机属性得到。就算我们清空回收站,也是将文件在注册表中的信息删除,硬盘中还有此文件,只不过通过正常方式找不到,并且其磁区不受保护,可能会被其他文件占据。
那么我们是不是就可以从这点入手,既然Debug版本没问题和Release版本有问题,但是接口依然能执行成功,我怀疑是Qt的Release版本在执行函数时,没有对文件信息进行更新获取。那么只需要更新获取一下此文件的信息就能解决此问题。
2、源代码
2.1、WinAPI调用
// 删除文件到回收站
bool deleteFileToCrash(QString name)
{qDebug() << "deleteStr name:" << name;bool ret = true;LPCTSTR lpSourceFile = name.toStdWString().c_str();SHFILEOPSTRUCT opRecycle;ZeroMemory(&opRecycle, sizeof(opRecycle));TCHAR ToBuf[MAX_PATH];TCHAR FromBuf[MAX_PATH];ZeroMemory(ToBuf, sizeof(ToBuf));ZeroMemory(FromBuf, sizeof(FromBuf));lstrcpy(FromBuf, lpSourceFile);opRecycle.hwnd = Q_NULLPTR;opRecycle.wFunc = FO_DELETE;opRecycle.pFrom = FromBuf;opRecycle.pTo = ToBuf;opRecycle.fFlags = FOF_ALLOWUNDO | FOF_SILENT;opRecycle.fAnyOperationsAborted = FALSE;opRecycle.hNameMappings = Q_NULLPTR;opRecycle.lpszProgressTitle = Q_NULLPTR;int returnVal = SHFileOperation(&opRecycle);qDebug() << "SHFileOperation end" << returnVal << opRecycle.fAnyOperationsAborted << GetLastError();if(returnVal != 0 || (opRecycle.fAnyOperationsAborted)) {qDebug() << "deleteFileToCrash error:" << returnVal;ret = false;}return ret;
}
2.2、两行代码解决Release版本根目录驱动问题
QFileInfo fInfo(name);Q_UNUSED(fInfo) // 这行代码只是不想使用这个fInfo
2.3、解决部分文件删除不成功的问题
是因为Windows对线程分配资源的问题,简单有效的方式:
QFuture<bool> isOK = QtConcurrent::run(this, &SFileManager::deleteFileToCrash, QDir::toNativeSeparators(path));
3、QFileInfo官方说明
4、Qt 5.15版本的功能
QFile::moveToTrash方法将文件移动到垃圾箱或者回收站,在此版本之前的版本只能通过我写的方式去删除哈。
Qt开发 之 删除文件或文件夹到回收站(详解)相关推荐
- c++中.dll与.lib文件的生成与使用的详解
c++中.dll与.lib文件的生成与使用的详解 --------------------------------------------------------------------------- ...
- 【运维】PowerShell编程 目录文件相关方法的封装与案例详解
PowerShell 目录文件管理 目录文件相关方法的封装与案例详解 李俊才 的 CSDN 博客:https://blog.csdn.net/qq_28550263?type=blog 邮箱 :291 ...
- JS - 文件上传组件WebUploader使用详解1(带进度的文件上传
一.基本介绍 1,什么是 WebUploader? WebUploader 是由百度公司团队开发的一个以 HTML5 为主,FLASH 为辅的现代文件上传组件. 官网地址:http://fex.bai ...
- AndroidManifest.xml文件配置教程及相关指令详解
AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- android 7 apk 安装程序,Android安装apk文件并适配Android 7.0详解
Android安装apk文件并适配Android 7.0详解 首先在AndroidManifest.xml文件,activity同级节点注册provider: android:name="a ...
- java文件打包jar文件_把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- pydicom读取头文件_.dcm格式文件软件读取及python处理详解
要处理一些.dcm格式的焊接缺陷图像,需要读取和显示.dcm格式的图像.通过搜集资料收集到一些医学影像,并通过pydicom模块查看.dcm格式文件. 若要查看dcm格式文件,可下echo viewe ...
- Linux下zip格式文件的解压缩与压缩操作命令详解
< Linux下zip格式文件的解压缩与压缩操作命令详解 > * 声明:网上找来比较凌乱,整理了一下,方便自己查看 zip格式文件的解压缩与压缩操作: 1.把/home目录下面的huaza ...
- java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解
今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 org.c ...
最新文章
- 模板 - 计算几何相关公式大全
- loj6300 「CodePlus 2018 3 月赛」博弈论与概率统计
- Qt设置应用程序图标
- Android自定义Shape
- 大数据在各行业中的应用表现
- 木桶问题MATLAB,物理实验绪论-喻小强.ppt
- 如何:使用 DataAnnotations 特性验证模型数据+MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类
- 精仿B站播放器外加弹幕库源码-带后台
- 互联网产品经理的工作职责
- 安全教育思维导图模板分享
- 助力网络安全发展,安全态势攻防赛事可视化
- 正则表达式regex(入门使用)
- 华为云IoT设备接入服务全体验
- 麒麟820和鸿蒙系统,网曝魅族正在适配麒麟820和鸿蒙系统,黄章:我怎么不知道...
- 过账期间未清和关帐过帐期间设置
- 基于ESP8266的四旋翼无人机代码分享,该无人机可以爬墙哦
- python中函数的定义_Python函数是什么_如何定义和调用函数?
- 003. 电话号码的字母组合——回溯算法
- 相机ISP图像处理流程
- Exchange 2010通配符SSL证书安装文档
热门文章
- lingo入门教程之二 --- 集合运用
- 大陆车牌识别算法的背景与技术
- 人工智能 - 虚拟人 - 2D/3D 动作捕捉
- IPO笔记之:关于自然人股东投资移民变更身份对IPO事宜之影响
- 今日头条推荐算法原理
- 解决uniapp运行到微信开发者工具报 [微信小程序开发者工具] [error] IDE service port disabled. To use CLI Call错误问题
- 阿里云服务器使用宝塔面板管理以及项目部署
- java 实验室预约系统_基于Java的实验室预约管理系统
- 关于Shine-hale
- HTML+CSS+JS网站设计——上海美食(8页) 酒水网页设计作业,甜品美食网页制作作业, 学生零食网页作业