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规范的“回收站”目录)。

实现步骤

  1. 平台检测:首先,你需要检测运行程序的平台,以便确定使用哪种方法。

  2. Windows实现:在Windows上,你可以使用syscall包来调用SHFileOperation函数,它是Windows API的一部分,用于执行文件操作,包括删除到回收站。

  3. 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)}
}

代码解释

  1. 常量定义:定义了一些需要用到的常量,比如FO_DELETE(用于删除操作)和FOF_ALLOWUNDO(允许撤销)。

  2. SHFILEOPSTRUCT结构体:这个结构体用于SHFileOperation函数的参数,包含了操作类型、源文件路径、目标文件路径(在这个例子中不使用),以及其他标志。

  3. moveToRecycleBin函数

    • 将文件路径转换为以空字符结尾的UTF-16字符串。
    • 加载shell32.dll动态链接库并查找SHFileOperationW函数。
    • 调用SHFileOperationW函数来执行删除操作。如果返回值不为0,则表示操作失败。
  4. 错误处理:如果加载DLL或查找函数失败,或者函数执行返回错误,函数会返回相应的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝商品评论:商家了解市场趋势和竞争状况的窗口

淘宝商品评论是消费者对购买商品的反馈和评价&#xff0c;是商家了解市场趋势、消费者需求以及竞争状况的重要窗口。通过对商品评论的深入研究和分析&#xff0c;商家可以获取有价值的市场信息和用户需求&#xff0c;从而调整产品策略、优化营销方案以及制定更具针对性的市场竞…

飞书+ChatGPT搭建智能AI助手,无公网ip实现公网访问飞书聊天界面

飞书ChatGPT搭建智能AI助手&#xff0c;无公网ip实现公网访问飞书聊天界面 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 …

光模块市场分析与发展趋势预测

光模块是光通信领域的重要组成部分&#xff0c;随着数字经济&#xff0c;大数据&#xff0c;云计算&#xff0c;人工智能等行业的兴起&#xff0c;光模块市场经历了快速发展&#xff0c;逐渐在数据中心、无线回传、电信传输等应用场景中得到广泛应用。本文将基于当前光模块全球…

Android Studio打包有哪些优势

大家好&#xff0c;现在移动应用程序的快速发展&#xff0c;开发者需要一个强大又可靠的开发环境来创建和打包高质量的 Android 应用程序。Android Studio 是一款由 Google 官方开发的 Android 应用程序开发环境&#xff0c;提供了许多的优势和便利&#xff0c;那究竟都有哪些优…

MySQL的安装(详细步骤 亲测可用)

Mysql的安装&#xff08;详细步骤 亲测可用&#xff09; MySQL安装配置教程&#xff08;超级详细、保姆级&#xff09;

基于51的智能交通信号灯设计

文章目录 概要仿真图程序总结 资料下载地址&#xff1a;基于51的智能交通信号灯设计 概要 可实现东西、南北两个方向的红、黄、绿灯按设定的时间亮灭&#xff0c;用以指引交通通行&#xff0c;以倒计时方向显示时间。红、黄、绿交通灯的变化规律为&#xff1a; 1&#xff09…

RosettaFold、ProteinMPNN和AlphaFold之间的主要区别

RosettaFold、ProteinMPNN和AlphaFold是蛋白质结构预测领域的三个重要工具&#xff0c;各有其独特之处。下面是它们之间的主要区别&#xff1a; RosettaFold 技术基础&#xff1a;RosettaFold基于著名的Rosetta软件套件。它结合了传统的蛋白质建模方法与深度学习技术&#xff…

PlaidCTF roll-a-d8

第一次尝试最后不采用wasm写shellcode来getshell class Memory{constructor(){this.buf new ArrayBuffer(8);this.f64 new Float64Array(this.buf);this.u32 new Uint32Array(this.buf);this.bytes new Uint8Array(this.buf);}d2u(val){ //double > Uint64this.f64[…

ros2/ros 4轮2驱机器人xacro/urdf文件示例代码

这个实验中最重要的是&#xff1a;colcon build 之后要记得source install/setup.bash.否则修改的文件是不会更新的。知道了吧 <robot name"half" xmlns:xacro"http://wiki.ros.org/wiki/xacro"><xacro:property name"PI" value"3…

Django 简单图书管理系统

一、图书需求 1. 书籍book_index.html中有超链接&#xff1a;查看所有的书籍列表book_list.html页面 2. 书籍book_list.html中显示所有的书名&#xff0c;有超链接&#xff1a;查看本书籍详情book_detail.html(通过书籍ID)页面 3. 书籍book_detail.html中书的作者和出版社&…

2023年全球软件开发大会(QCon北京站2023)2月-核心PPT资料下载

一、峰会简介 本次活动聚焦云原生、分布式数据库、现代数据技术栈一系列前沿技术与实践&#xff0c;为技术团队负责人、架构师、开发人员等提供了技术学习与交流的平台。 本次峰会包含&#xff1a;AI基础架构、DevOps流程与实践、ML模型效率与易用性、测试环境治理、大规模集…

关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系与区别

一、相关定义 1、Trunk口&#xff0c;Trunk口上可以同时传送多个VLAN的包&#xff0c;一般用于交换机之间的链接。 2、Hybrid口&#xff0c;Hybrid口上可以同时传送多个VLAN的包&#xff0c;一般用于交换机之间的链接或交换机于服务器的链 接。 3、Access口&#xff0c;Acce…

Nginx 安装(源码编译安装)

Nginx服务器提供了Windows和Linux版本&#xff0c;本文为Linux环境下Nginx服务器的详细安装步骤。 安装环境&#xff1a; Linux服务器操作系统&#xff1a;CentOs 8.1.1911 Nginx版本&#xff1a;1.21.4&#xff08;Linux&#xff09; 安装步骤&#xff1a; 1、安装GCC、aut…

单片机LCD1602

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、LCD1602是什么&#xff1f;二、LCD1602 原理三、显示一个字符四、如何显示四位数五、参考历程六、封装成一个显示 字符和一个显示任意四位数的函数总结 前言…

win7系统装visual studio

win7系统装visual studio 2023/12/18 安装实例 文章目录 win7系统装visual studio前言一、WIN7安装VS2019需要的两个补丁kb4474419-v3/kb4490628二、在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包三、修改为兼容性为兼容win7四、安装.NET五、安装进程卡在95%总结…

缓存:系统设计中至关重要的一环

什么是缓存&#xff1f; 缓存就像是一个超快速的存储区域&#xff0c;保存了计算机或手机经常使用的内容的副本&#xff0c;这样可以在不访问较慢的主存储器的情况下快速获取。 一个现实中的例子可以是&#xff0c;每当我们购买杂货时&#xff0c;通常会倾向于大量购买&#…

I.MX6ULL_Linux_驱动篇(47)linux RTC驱动

RTC 也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于 Linux 系统而言时间是非常重要的&#xff0c;就和我们使用 Windows 电脑或手机查看时间一样&#xff0c;我们在使用 Linux 设备的时候也需要查看时间。本章我们就来学习一下如何编写 Linux 下的 RTC 驱动程…

云南省中小学校学籍系统照片采集要求及拍照方法

云南省各地中小学校陆续开展新一年度的学籍照片采集工作&#xff0c;同时中高考报名、毕业照片的采集也即将开始&#xff0c;然而很多学籍管理员和信息员都遇到一个问题&#xff0c;就是这些照片的尺寸要求、背景颜色、文件命名方式都不一样&#xff0c;全校动辄几百上千名学生…

从入门到放弃之「ClickHouse」

文章目录 1. 写在最前面1.1 思路 2. ClickHouse2.1 基本概念2.2 高端用法2.2.1 条件判断2.2.2 HAVING2.2.3 CASE WHEN2.2.4 window function 3. 碎碎念4. 参考资料 1. 写在最前面 最近在整理 api 成功率的问题。但是总结下来以下三点是我分析路上的绊脚石。 上报链路还不够稳定…