C++ Go语言实现将windows和linux文件删除至回收站

 更新时间:2023年12月20日 08:48:33   作者:Thomas_Lbw  
这篇文章主要为大家详细介绍了如何分别使用C++ Go语言实现将windows和linux文件删除至回收站,感兴趣的小伙伴可以跟随小编一起学习一下

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>
#endif
 
bool 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;
 
    #else
    std::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 main
 
import (
    "fmt"
    "os"
    "path/filepath"
    "runtime"
    "syscall"
    "unsafe"
)
 
// Windows API常量
const (
    FO_DELETE           = 0x0003
    FOF_ALLOWUNDO       = 0x0040
    FOF_NOCONFIRMATION  = 0x0010
)
 
type SHFILEOPSTRUCT struct {
    hwnd    syscall.Handle
    wFunc   uint32
    pFrom   *uint16
    pTo     *uint16
    fFlags  uint16
    fAnyOps bool
    hNameMappings uintptr
    lpszProgressTitle *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 main
 
import (
    "fmt"
    "os"
    "syscall"
    "unsafe"
)
 
const (
    FO_DELETE           = 0x0003
    FOF_ALLOWUNDO       = 0x0040
    FOF_NOCONFIRMATION  = 0x0010
)
 
type SHFILEOPSTRUCT struct {
    hwnd    syscall.Handle
    wFunc   uint32
    pFrom   *uint16
    pTo     *uint16
    fFlags  uint16
    fAnyOps bool
    hNameMappings uintptr
    lpszProgressTitle *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或查找函数失败,或者函数执行返回错误,函数会返回相应的错误。

以上就是C++ Go语言实现将windows和linux文件删除至回收站的详细内容,更多关于C++ Go文件删除至回收站的资料请关注脚本之家其它相关文章!

相关文章

  • C语言、Java、Python的选择与未来指南(适合新手)

    C语言、Java、Python的选择与未来指南(适合新手)

    作为新手选择第一门编程语言是关键一步,它会影响你的学习兴趣和未来方向,这篇文章主要介绍了C语言、Java、Python选择与未来指南的相关资料,需要的朋友可以参考下
    2025-12-12
  • 2019-nCoV 全国新型肺炎疫情每日动态趋势可视图

    2019-nCoV 全国新型肺炎疫情每日动态趋势可视图

    大家被新型冠状病毒搞的人心慌慌,每天宅在家里那也去不了,今天小编给大家分享2019-nCoV 全国新型肺炎疫情每日动态趋势可视图,需要的朋友可以参考下
    2020-02-02
  • 最新idea2021注册码永久激活(激活到2100年)

    最新idea2021注册码永久激活(激活到2100年)

    这篇文章主要介绍了idea2021注册码永久激活(激活到2100年),文中给大家提到了2020年最新JetBrains授权服务器-IntelliJ IDEA激活,需要的朋友可以参考下
    2020-01-01
  • VSCode SSH远程连接与删除的实现步骤

    VSCode SSH远程连接与删除的实现步骤

    本文主要介绍了VSCode SSH远程连接与删除的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • xmind免费安装使用保姆级教程详解

    xmind免费安装使用保姆级教程详解

    xmind 是一款功能强大、易用且具有丰富资源的思维导图软件,本文将为您介绍 xmind 的安装和使用方法,包括基本功能、高级功能、专业版功能、使用技巧、常见问题等,帮助您快速上手使用 xmind
    2023-04-04
  • git pull时冲突的几种解决方式(小结)

    git pull时冲突的几种解决方式(小结)

    这篇文章主要介绍了git pull时冲突的几种解决方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 本地搭建DeepSeek-R1、WebUI的完整过程及访问

    本地搭建DeepSeek-R1、WebUI的完整过程及访问

    这篇文章主要介绍了本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主要用于大语言模型的本地部署和管理,通过Docker和Ollama工具,用户可以在自己的服务器上运行DeepSeek-R1,并通过WebUI交互和测试,需要的朋友可以参考下
    2025-02-02
  • 利用ChatGPT与MindShow制作一个PPT的方法详解

    利用ChatGPT与MindShow制作一个PPT的方法详解

    PPT制作是商务、教育和各种场合演讲的重要组成部分,然而,很多人会花费大量时间和精力在内容生成和视觉设计方面,为了解决这个问题,我们可以利用两个强大的工具——ChatGPT和MindShow,来提高制作PPT的效率,感兴趣的同学可以参考阅读
    2023-06-06
  • ChatGPT与Remix Api服务在浏览器url地址中对话详解

    ChatGPT与Remix Api服务在浏览器url地址中对话详解

    这篇文章主要为大家介绍了ChatGPT与Remix Api服务在浏览器url地址中对话详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • git push origin HEAD:refs/for/master 的意思分析

    git push origin HEAD:refs/for/master 的意思分析

    这篇文章主要介绍了git push origin HEAD:refs/for/master 的意思,补充介绍了git 提交代码常用命令,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01

最新评论