windows和linux将文件删除至回收站【C++】【Go】语言实现
目录
C++
Windows平台
Linux平台
开平台,代码合并
Go
实现步骤
Go语言实现示例
go单独的windows版本实现
代码解释
C++
在C++中,将文件移动到回收站的实现在Linux和Windows平台上是不同的。首先,我会为你提供在Windows平台上实现的代码示例,然后再提供Linux平台上的对应实现。
Windows平台
在Windows平台上,你可以使用SHFileOperation
函数来将文件移动到回收站。这个函数定义在Shellapi.h
头文件中。以下是一个简单的示例
#include <windows.h>
#include <shellapi.h>void moveToRecycleBin(const char* filePath) {SHFILEOPSTRUCT fileOp;ZeroMemory(&fileOp, sizeof(fileOp));fileOp.wFunc = FO_DELETE;fileOp.pFrom = filePath;fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;SHFileOperation(&fileOp);
}int main() {moveToRecycleBin("C:\\path\\to\\your\\file.txt");return 0;
}
Linux平台
在Linux系统中,将文件“删除”到回收站的操作实际上并不是直接删除文件,而是将其移动到一个特定的目录(通常是用户目录下的一个隐藏文件夹)。这是因为Linux没有一个统一的、系统级的回收站功能,不像Windows的回收站那样。因此,将文件“删除”到回收站实际上是把文件从它原来的位置移动到这个隐藏的回收站目录。
#include <iostream>
#include <fstream>
#include <string>
#include <sys/stat.h>
#include <unistd.h>bool moveToTrash(const std::string& filePath) {const char* homeDir = getenv("HOME");if (!homeDir) {std::cerr << "Error: HOME environment variable not set." << std::endl;return false;}std::string trashFilesPath = std::string(homeDir) + "/.local/share/Trash/files/";std::string trashInfoPath = std::string(homeDir) + "/.local/share/Trash/info/";std::string baseName = filePath.substr(filePath.find_last_of('/') + 1);std::string destFilePath = trashFilesPath + baseName;std::string destInfoPath = trashInfoPath + baseName + ".trashinfo";// 创建回收站文件和信息目录(如果不存在)mkdir(trashFilesPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);mkdir(trashInfoPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);// 写入.trashinfo文件std::ofstream trashInfoFile(destInfoPath);if (!trashInfoFile) {std::cerr << "Error: Unable to create trash info file." << std::endl;return false;}trashInfoFile << "[Trash Info]\nPath=" << filePath << "\nDeletionDate=" << /* 获取当前日期和时间的代码 */ "\n";trashInfoFile.close();// 移动文件到回收站if (rename(filePath.c_str(), destFilePath.c_str()) != 0) {perror("Error moving file to trash");return false;}return true;
}int main() {std::string filePath = "/path/to/your/file.txt"; // 替换为要删除的文件路径if (!moveToTrash(filePath)) {return 1;}return 0;
}
跨平台,代码合并
要在同一个程序中同时支持Windows和Linux平台的文件删除到回收站的功能,我们可以使用预处理器指令来区分操作系统,并在每个平台上执行相应的操作。同时,为了确保代码的稳定性,我们需要添加适当的错误处理来避免程序崩溃即使在删除失败的情况下。以下是一个跨平台的示例实现
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>#ifdef _WIN32
#include <windows.h>
#include <shellapi.h>
#endif#ifdef __linux__
#include <sys/stat.h>
#include <unistd.h>
#endifbool moveToRecycleBin(const std::string& filePath) {#ifdef _WIN32// Windows 实现SHFILEOPSTRUCT shfos;ZeroMemory(&shfos, sizeof(shfos));shfos.wFunc = FO_DELETE;shfos.pFrom = filePath.c_str();shfos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;return SHFileOperation(&shfos) == 0;#elif __linux__// Linux 实现const char* homeDir = getenv("HOME");if (!homeDir) {std::cerr << "Error: HOME environment variable not set." << std::endl;return false;}std::string trashFilesPath = std::string(homeDir) + "/.local/share/Trash/files/";std::string trashInfoPath = std::string(homeDir) + "/.local/share/Trash/info/";std::string baseName = filePath.substr(filePath.find_last_of('/') + 1);std::string destFilePath = trashFilesPath + baseName;std::string destInfoPath = trashInfoPath + baseName + ".trashinfo";mkdir(trashFilesPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);mkdir(trashInfoPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);std::ofstream trashInfoFile(destInfoPath);if (!trashInfoFile) {std::cerr << "Error: Unable to create trash info file." << std::endl;return false;}trashInfoFile << "[Trash Info]\nPath=" << filePath << "\nDeletionDate=" << /* 获取当前日期和时间的代码 */ "\n";trashInfoFile.close();return rename(filePath.c_str(), destFilePath.c_str()) == 0;#elsestd::cerr << "Unsupported platform." << std::endl;return false;#endif
}int main() {std::string filePath = "/path/to/your/file.txt"; // 替换为要删除的文件路径if (!moveToRecycleBin(filePath)) {std::cerr << "Failed to move file to recycle bin." << std::endl;return 1;}return 0;
}
Go
在Go语言中,将文件移动到回收站的功能比较复杂,因为Go本身没有提供直接操作系统回收站的API。这意味着你需要调用操作系统特定的功能。对于Windows,你可以使用系统调用来调用相应的Windows API。而在Linux上,由于标准的“回收站”是桌面环境特定的,通常的做法是将文件移动到一个特定的目录(例如,基于FreeDesktop.org规范的“回收站”目录)。
实现步骤
-
平台检测:首先,你需要检测运行程序的平台,以便确定使用哪种方法。
-
Windows实现:在Windows上,你可以使用
syscall
包来调用SHFileOperation
函数,它是Windows API的一部分,用于执行文件操作,包括删除到回收站。 -
Linux实现:在Linux上,你可以简单地将文件移动到特定的回收站目录(通常是
~/.local/share/Trash/files/
),但这不是标准化的,可能会根据不同的桌面环境有所变化。
Go语言实现示例
以下是一个简化的Go语言实现示例。请注意,这个示例仅适用于演示目的,并不包括详细的错误处理和复杂的操作系统交互。
package mainimport ("fmt""os""path/filepath""runtime""syscall""unsafe"
)// Windows API常量
const (FO_DELETE = 0x0003FOF_ALLOWUNDO = 0x0040FOF_NOCONFIRMATION = 0x0010
)type SHFILEOPSTRUCT struct {hwnd syscall.HandlewFunc uint32pFrom *uint16pTo *uint16fFlags uint16fAnyOps boolhNameMappings uintptrlpszProgressTitle *uint16
}func moveToRecycleBin(filePath string) error {switch runtime.GOOS {case "windows":// Windows实现shFileOp := &SHFILEOPSTRUCT{wFunc: FO_DELETE,pFrom: syscall.StringToUTF16Ptr(filePath + "\x00"),fFlags: FOF_ALLOWUNDO | FOF_NOCONFIRMATION,}shfileopProc, err := syscall.LoadDLL("shell32.dll").FindProc("SHFileOperationW")if err != nil {return err}ret, _, _ := shfileopProc.Call(uintptr(unsafe.Pointer(shFileOp)))if ret != 0 {return fmt.Errorf("SHFileOperationW failed: return value %d", ret)}case "linux":// Linux实现homeDir, err := os.UserHomeDir()if err != nil {return err}trashPath := filepath.Join(homeDir, ".local/share/Trash/files")if _, err := os.Stat(trashPath); os.IsNotExist(err) {if err := os.MkdirAll(trashPath, 0755); err != nil {return err}}baseName := filepath.Base(filePath)destPath := filepath.Join(trashPath, baseName)err = os.Rename(filePath, destPath)if err != nil {return err}default:return fmt.Errorf("unsupported platform")}return nil
}func main() {err := moveToRecycleBin("C:\\path\\to\\your\\file.txt") // 替换为你要删除的文件路径if err != nil {fmt.Println("Error:", err)os.Exit(1)}
}
- 平台检测:通过
runtime.GOOS
检测运行的操作系统。 - Windows实现:(注释掉的部分)需要使用
syscall
包来调用Windows API。这是一个比较高级和复杂的操作,需要对Windows API有深入了解。 - Linux实现:简单地将文件移动到预定义的回收站目录。
- 错误处理:在实际应用中,应该添加更多的错误处理逻辑以处理各种可能的异常情况。
go单独的windows版本实现
在Go语言中实现将文件移动到Windows回收站的功能相对复杂,因为需要使用Windows API。这通常涉及到调用SHFileOperation
函数。在Go中,你可以通过syscall
包来进行系统调用。以下是一个可能的实现方式,但请注意,这需要对Windows API有一定的了解,并且可能需要根据你的具体需求进行调整。
package mainimport ("fmt""os""syscall""unsafe"
)const (FO_DELETE = 0x0003FOF_ALLOWUNDO = 0x0040FOF_NOCONFIRMATION = 0x0010
)type SHFILEOPSTRUCT struct {hwnd syscall.HandlewFunc uint32pFrom *uint16pTo *uint16fFlags uint16fAnyOps boolhNameMappings uintptrlpszProgressTitle *uint16
}func moveToRecycleBin(filePath string) error {shFileOp := &SHFILEOPSTRUCT{wFunc: FO_DELETE,pFrom: syscall.StringToUTF16Ptr(filePath + "\x00"),fFlags: FOF_ALLOWUNDO | FOF_NOCONFIRMATION,}shfileopProc, err := syscall.LoadDLL("shell32.dll").FindProc("SHFileOperationW")if err != nil {return err}ret, _, _ := shfileopProc.Call(uintptr(unsafe.Pointer(shFileOp)))if ret != 0 {return fmt.Errorf("SHFileOperationW failed: return value %d", ret)}return nil
}func main() {err := moveToRecycleBin("C:\\path\\to\\your\\file.txt") // 替换为要删除的文件路径if err != nil {fmt.Println("Error:", err)os.Exit(1)}
}
代码解释
-
常量定义:定义了一些需要用到的常量,比如
FO_DELETE
(用于删除操作)和FOF_ALLOWUNDO
(允许撤销)。 -
SHFILEOPSTRUCT
结构体:这个结构体用于SHFileOperation
函数的参数,包含了操作类型、源文件路径、目标文件路径(在这个例子中不使用),以及其他标志。 -
moveToRecycleBin
函数:- 将文件路径转换为以空字符结尾的UTF-16字符串。
- 加载
shell32.dll
动态链接库并查找SHFileOperationW
函数。 - 调用
SHFileOperationW
函数来执行删除操作。如果返回值不为0,则表示操作失败。
-
错误处理:如果加载DLL或查找函数失败,或者函数执行返回错误,函数会返回相应的错误。
相关文章:
windows和linux将文件删除至回收站【C++】【Go】语言实现
目录 C Windows平台 Linux平台 开平台,代码合并 Go 实现步骤 Go语言实现示例 go单独的windows版本实现 代码解释 C 在C中,将文件移动到回收站的实现在Linux和Windows平台上是不同的。首先,我会为你提供在Windows平台上实现的代码示例…...
10 Vue3中v-html指令的用法
概述 v-html主要是用来渲染富文本内容,比如评论信息,新闻信息,文章信息等。 v-html是一个特别不安全的指令,因为它会将文本以HTML的显示进行渲染,一旦文本里面包含一些恶意的js代码,可能会导致整个网页发…...
华为数通方向HCIP-DataCom H12-831题库(多选题:181-200)
第181题 如图所示,R1、R2、R3、R4都部署为SPF区域0,链路的cost值如图中标识。R1、R2R3、R4的Loopback0通告入OSPF。R1、R2、R3与R4使用Loopback0作为连接接口,建立BGP对等体关系,其中R4为RR设备,R1、R2、R3是R4的客户端。当R4的直连地址172.20,1,4/32通告入BGP后,以下关R…...
DC-磁盘管理
2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 在DC2上安装及配置软RAID 5。在安装好的DC2虚拟机中添加三块10G虚拟磁盘。组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。配置步骤 关闭虚拟机,添加3块10G磁…...
使用Docker运行镜像文件与设置端口
1,创建镜像文件前准备 # 使用基础镜像FROM alpine:latest# 设置工作目录WORKDIR /app# 复制应用程序文件到镜像中COPY . .# 暴露容器的端口 不会自动将容器的端口映射到宿主机上 docker run -d -p <宿主机端口>:7080 <镜像名称>EXPOSE 7080# 定义容器启…...
Centos 8.5 Oracle12c安装
由于多次安装踩坑,所以本次写了一份12c安装的完整版。可以直接使用。 一、安装数据库基本信息 名称 值 主机名 database 操作系统 CentOS Linux release 8.5.2111 Oracle用户名/密码 oracle Oracle 版本 12c Enterprise Edition Release 12.2.0.1.0 oracle…...
Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现
Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 在Apache Tomcat中发现了一个被归类为关键的漏洞,该漏洞在8.5.4(Application Server Soft ware)以下。受影响的是组…...
ChatGLM3-6B 的调用参数说明,chat 与stream_chat 接口函数的参数说明
ChatGLM3-6B 是一个语言大模型,最近在评估这个模型,但发现它的文档有限,只能从demo代码中猜测调用的参数的含义,准确度是有限的;于是,通过查看源代码来研究,目前整理笔记如下: Chat…...
Vuex的学习-2
Vuex的核心概念 StateMutationAction 1.State State提供唯一的公共数据源,所有共享的数据都统一放在Store的State中进行存储。 const store new Vuex.Store({state : { count: 0 } }) 这是渲染的页面 组件访问数据的第一种方式 组件访问数据的第二种方式 // 1…...
智慧安防视频监控EasyCVR如何通过回调接口向第三方平台推送RTSP视频通道离线通知
安防视频监控系统EasyCVR能在局域网、公网、专网等复杂的网络环境中部署,可支持4G、5G、WiFi、有线等方式进行视频的接入与传输、处理和分发。平台能将接入的视频流进行汇聚、转码、多格式输出和分发,具体包括:RTMP、RTSP、HTTP-FLV、WebSock…...
Scrum项目管理流程及免费敏捷工具
项目启动: 团队明确项目愿景、目标和范围,确定项目范围和优先级,并建立团队以及开展初步计划。 制定产品待办事项清单(Product Backlog): 定义项目所需功能、任务和需求列表,并按优先级排序…...
大型医院PACS系统源码,影像存储与传输系统源码,支持多种图像处理及三维重建功能
PACS系统是医院影像科室中应用的一种系统,主要用于获取、传输、存档和处理医学影像。它通过各种接口,如模拟、DICOM和网络,以数字化的方式将各种医学影像,如核磁共振、CT扫描、超声波等保存起来,并在需要时能够快速调取…...
HDFS NFS Gateway(环境配置,超级详细!!)
HDFS NFS Gateway简介: HDFS NFS Gateway是Hadoop Distributed File System(HDFS)中的一个组件,它允许客户端通过NFS(Network File System,网络文件系统)与HDFS进行交互。具体来说,HDFS NFS…...
nginx 离线安装 https反向代理
这里写自定义目录标题 安装步骤1.安装nginx所需依赖1.1 安装gcc和gcc-c1.1.1下载依赖包1.1.2 上传依赖包1.1.3安装依赖 1.2 安装pcre1.2.1 下载pcre1.2.2 上传解压安装包1.2.3 编译安装 1.3 下载安装zlib1.3.1 下载zlib1.3.2 上传解压安装包1.3.3 编译安装 1.4 下载安装openssl…...
Linux Centos 配置 Docker 国内镜像加速
在使用 Docker 进行容器化部署时,由于国外的 Docker 镜像源速度较慢,我们可以配置 Docker 使用国内的镜像加速器,以提高下载和部署的效率。本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速。 步骤一:安装 Docker 首…...
中心下标-----来自力扣
本题使用go语言完成: 思路:1.先求出整个数组的和 2.用一个循环整个和减去左和看是否等于右和,如果等于,返回索引下标 寻找数组的中心索引 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一…...
手写单链表(指针)(next域)附图
目录 创建文件: 具体实现: 首先是头插。 注意:一定要注意:再定义tmp时,要给它赋一个初始值(推荐使用 new list_next) 接着是尾插: 随后是中间插: 然后是最简单的改值…...
关于with torch.no_grad:的一些小问题
with torch.no_grad:是截断梯度记录的,新生成的数据的都不记录梯度,但是今天产生了一点小疑惑,如果存在多层函数嵌入,是不是函数内所有的数据都不记录梯度,验证了一下,确实是的。 import torch x torch.r…...
大创项目推荐 深度学习 机器视觉 人脸识别系统 - opencv python
文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目…...
【PostGIS】空间数据库-常用空间函数
记录一些常用的空间函数: 1、转换函数 在几何图形和外部数据格式之间进行转换的函数。 -- 将文本表示转换为几何类型 -- 结果:0101000000000000000000F03F000000000000F03F SELECT st_geomfromtext(point(1 1),0);-- 将几何类型转换为文本表示 -- 结果…...
程序员的50大JVM面试问题及答案
文章目录 1.JDK、JRE、JVM关系?2.启动程序如何查看加载了哪些类,以及加载顺序?3. class字节码文件10个主要组成部分?4.画一下jvm内存结构图?5.程序计数器6.Java虚拟机栈7.本地方法栈8.Java堆9.方法区10.运行时常量池?…...
架构设计系列之前端架构和后端架构的区别和联系
前端架构和后端架构都是软件系统中最关键的架构层,负责处理不同方面的任务和逻辑,两者之间是存在一些区别和联系的,我会从以下几个方面来阐述: 一、定位和职责 前端架构 主要关注用户界面和用户体验,负责处理用户与…...
UE5 水材质注意要点
1、两个法线反向交替流动,可以去观感假的现象 2、水面延边的透明度低 3、增加水面延边的浪花 4、增加折射 折射要整体质量至少在High才有效果 改为半透明材质没有法线信息? 5、处理反射效果 勾选为true 找到这个放在水域 勾为false,即可有非…...
数据安全扫描仪荣膺网络安全优秀创新成果大赛优胜奖 - 凸显多重优势
近日,由中国网络安全产业联盟(CCIA)主办、CCI数据安全工作委员会中国电子技术标准化研究院等单位承办的“2023年网络安全优秀创新成果大赛”获奖名单公布。天空卫士数据安全扫描仪(DSS)产品获得创新成果大赛优胜奖。 本…...
数据结构学习 leetcode64最小路径和
动态规划 题目: 建议看这里,有这道题详细的解析。我觉得写的挺好。 这是我在学动态规划的时候,动手做的一道题。 虽然我在学动态规划,但是我之前学了dps,所以我就想先用dps试着做,结果发现不行…...
导出(导入)Linux虚拟机并修改IP地址
一、导出虚拟机 说明:先关闭虚拟机,然后再进行导出。 步骤1:选择要导出的虚拟机 步骤2:选择文件菜单栏下的导出为OVF文件。 步骤3:将导出的文件保存至硬盘文件夹。 二、导入虚拟机 步骤1:选择文件菜单栏…...
OpenCV4工业缺陷检测的六种方法
👨🎓博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…...
ICC2:Less than minimum edge length和Concave convex edge enclosure
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 首先,要介绍一下这两种drc Less than minimum edge length对应的tf rule如下: 而Concave convex edge enclosure对应图示和tf 规则如下,可...
RouterSrv-DHCP
2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 安装和配置DHCP relay服务,为办公区域网络提供地址上网。DHCP服务器位于AppSrv服务器上。拆分DHCP服务器上的作用域,拆分的百分比为7:3。InsideCli优先从RouterSrv获取地址。配置步骤 安装和配置DHCP relay服务,为办…...
【人生苦短,我学 Python】(8)文件的读写和过滤器
目录 简述 / 前言1. 文件的操作2. 过滤器2.1 more —— 逐屏显示数据2.2 sort —— 排序2.3 more 和 sort 一起用 文章传送门 简述 / 前言 上一篇我们介绍了 Python 的输入(input)和输出(print),以及如何通过命令行给…...
钉钉免登 wordpress/全网万能搜索引擎
[url]http://bbs.kafan.cn/viewthread.php?tid211671&extrapage%3D1[/url]相信各位一定在为电脑中毒.流氓插件等问题头疼重装系统,一键还原这些解决办法都存在各种不足.传统的杀毒软件面对如今铺天盖地的病毒,***,流氓软件也是只有招架之功.无还手之力.归根结底,我们得想办…...
建昌县城乡规划建设局网站/怎么弄自己的网站
使用XML在SQL Server上创建计算列 在SQL Server数据库中,当你想使用一个数据,而这个数据不保存在表中,计算列很有用。例如,你有一张表,它包括列dollar amounts, wholesale prices和retail prices。你肯定不想在每次查询…...
济南商城网站制作/公关公司
0805封装尺寸/0402封装尺寸/0603封装尺寸/1206封装尺寸封装尺寸与功率关系:0201 1/20W0402 1/16W0603 1/10W0805 1/8W1206 1/4W封装尺寸与封装的对应关系04021.0mmx0.5mm06031.6mmx0.8mm08052.0mmx1.2mm12063.2mmx1.6mm12103.2mmx2.5mm18124.5mmx3.2mm22255.6mmx6.5…...
网站建设seo优化方案/百度收录提交
亲测可用 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2 企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV...
有什么网站是做投资的/关键词的选取原则有
基本概念 在组成原理以及体系结构中经常遇到 CPU Cycle(CPU 周期)、Instruction Cycle(指令周期)、Clock Cycle(时钟周期)这些概念,这篇文章详细拆解一下他们之间联系与区别。废话不多说,直接开门见山给出对应的概念。 CPU Cycle:CPU 内部的…...
重庆建立公司网站/企业网站seo优化
详解Java异常Throwable、Error、Exception、RuntimeException的区别 在Java中,根据错误性质将运行错误分为两类:错误和异常。在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递Java运行时系…...