C++实现对回收站里的文件进行操作的示例代码

 更新时间:2023年06月25日 09:29:09   作者:逃逸的卡路里  
这篇文章主要为大家详细介绍了C++如何使用代码对回收站里的文件进行操作,譬如文件的删除与恢复等,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴快跟随小编一起学习学习吧

方式一:设置不同的SHFILEOPSTRUCT结构体,调用SHFileOperation函数就可以实现拷贝、删除、移动等文件操作

SHGetSpecialFolderLocation函数:

原型:

HRESULT SHGetSpecialFolderLocation(HWND hwnd, int csidl,
PIDLIST_ABSOLUTE* ppidl)

该函数用于获取特殊文件夹的物理路径。它接受以下参数:

  • hwnd:可选参数,指定父窗口的句柄。如果不需要与窗口关联,可以设置为NULL。
  • csidl:表示特殊文件夹的标识符(CSIDL),用于指定要获取的文件夹。
  • ppidl:一个指向PIDLIST_ABSOLUTE类型的指针,用于接收文件夹的ITEMIDLIST。

功能:根据给定的特殊文件夹标识符,该函数将返回与之对应的文件夹的物理路径。通过该函数获取回收站文件夹的物理路径可以进一步操作其中的文件。

SHGetPathFromIDList函数:

原型:

BOOL SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl, LPWSTR pszPath)

该函数用于根据ITEMIDLIST(在这里是通过SHGetSpecialFolderLocation获得的PIDLIST_ABSOLUTE)返回文件夹的路径。

功能:该函数将ITEMIDLIST转换为文件夹的字符串路径。

SHFileOperation函数:

原型:

int SHFileOperation(const SHFILEOPSTRUCT* lpFileOp)

该函数用于执行文件操作,如复制、移动和删除等。它接受以下参数:

lpFileOp:指向SHFILEOPSTRUCT结构的指针,描述要执行的文件操作。

功能:该函数执行文件操作,可以将文件复制、移动或删除到指定位置,包括回收站。可以设置FOF_ALLOWUNDO标志以启用撤销功能。

SHFILEOPSTRUCT结构体:

定义:

typedef struct _SHFILEOPSTRUCT
{
HWND hwnd;
UINT wFunc;
LPCWSTR pFrom;
LPCWSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCWSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

成员变量:

  • hwnd:可选参数,表示父窗口的句柄。 wFunc:表示要执行的文件操作类型,如复制、移动、删除等。
  • pFrom:指向源文件/文件夹的路径字符串。 pTo:指向目标文件/文件夹路径字符串。
  • fFlags:控制文件操作的标志位,如FOF_ALLOWUNDO、FOF_NOCONFIRMATION等。
  • fAnyOperationsAborted:如果用户取消了任何一个操作,则为TRUE。
  • hNameMappings:保留参数,应设置为NULL。 lpszProgressTitle:可选参数,用于在进度对话框中显示自定义标题。

该结构描述了要进行的文件操作的详细信息,包括源文件/文件夹路径、目标路径、操作类型和标志等。传递此结构给SHFileOperation函数可执行相应的文件操作。

代码示例:

使用Shell API:你可以使用Windows的Shell API来访问回收站,并获取回收的文件信息。

1、使用SHGetSpecialFolderLocation函数通过指定回收站的CSIDL_BITBUCKET标识符来获取回收站的物理路径。

2、使用SHGetPathFromIDList函数将回收站路径转换为字符串格式存储在sFolderPath中。

3、构建搜索路径sSearchPath,用于遍历回收站文件夹中的文件。

4、使用FindFirstFile和FindNextFile函数遍历回收站文件夹中的每个文件。

5、对于每个文件,使用_tprintf函数在控制台上输出其文件名和完整路径。

6、最后使用FindClose关闭文件搜索句柄。

#include <Windows.h>
#include <ShlObj.h>
int main() {
    // 获取回收站的路径
    LPITEMIDLIST pidlBin;
    SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlBin);
    // 将回收站的路径转换为字符串格式
    TCHAR szFolderPath[MAX_PATH];
    SHGetPathFromIDList(pidlBin, szFolderPath);
    // 构建搜索路径
    TCHAR szSearchPath[MAX_PATH];
    _stprintf_s(szSearchPath, MAX_PATH, _T("%s\\*"), szFolderPath);
    // 遍历回收站文件夹中的文件
    WIN32_FIND_DATA findData;
    HANDLE hFind = FindFirstFile(szSearchPath, &findData);
    if (hFind != INVALID_HANDLE_VALUE) {
        do {
            // 输出文件名和完整路径
            _tprintf(_T("File: %s\n"), findData.cFileName);
            _tprintf(_T("Path: %s\\%s\n"), szFolderPath, findData.cFileName);
        } while (FindNextFile(hFind, &findData));
        FindClose(hFind);
    }
    return 0;
}

使用Shell API的SHFILEOPSTRUCT结构和SHFileOperation函数来执行文件操作,包括将文件恢复到原始路径。

#include <Windows.h>
#include <ShlObj.h>
int main() {
    // 设置恢复操作的源文件路径和目标文件夹路径
    TCHAR szSourceFilePath[] = _T("C:\\RecycleBin\\file.txt");
    TCHAR szDestinationFolderPath[] = _T("C:\\OriginalPath");
    // 构建SHFILEOPSTRUCT结构
    SHFILEOPSTRUCT fileOpStruct;
    ZeroMemory(&fileOpStruct, sizeof(SHFILEOPSTRUCT));
    fileOpStruct.wFunc =_RENAME;
    fileOpStruct.pFrom = szSourceFilePath;
    fileOpStruct.pTo = szDestinationFolderPath;
    fileOpStruct.fFlags = FOF_ALLOWUNDO;
    // 执行恢复操作
    int result = SHFileOperation(&fileOpStruct);
    if (result == 0) {
        // 恢复成功
        // ...
    }
    return 0;
}

删除回收站里的文件:

#include <Windows.h>
#include <Shlobj.h>
#include <iostream>
int main() {
    LPITEMIDLIST pidlBin;
    SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlBin);
    // 构建文件操作的结构体
    SHFILEOPSTRUCT fileOpStruct;
    ZeroMemory(&fileOpStruct, sizeof(SHFILEOPSTRUCT));
    fileOpStruct.hwnd = NULL;  // 父窗口句柄(可选)
    fileOpStruct.wFunc = FO_DELETE;  // 执行删除OpStruct.pFrom = reinterpret_cast<LPCWSTR>(pidlBin);  // 源文件路径
    fileOpStruct.fFlags = FOF_ALLOWUNDO | FOF_NO_UI;  // 标志位
    int result = SHFileOperation(&fileOpStruct);  // 执行文件操作
    if (result == 0 && !fileOpStruct.fAnyOperationsAborted) {
        std::cout << "文件删除成功!" << std::endl;
    } else {
        std::cerr << "文件删除失败:" << result << std::endl;
    }
    CoTaskMemFree(pidlBin);  // 释放内存
   ;
}

方式二:使用第三方库,例如Boost和Qt等,它供了更高级的文件系统操作接口

以Boost库为例:

Boost是一个开源的C++库集合,增强功能和性能。它提供了许多高质量、可移植且经过广泛测试的模块和组件,覆盖了从基本数据结构到高级功能的各个方面。下面是Boost库中一些常用模块和其功能的简要介绍:

1、Boost.Filesystem(文件系统):该模块为C++操作文件系统提供了便捷且跨平台的接口,包括文件路径操作、目录遍历、文件访问等。

  • boost::filesystem::path:表示文件或目录的路径,提供了丰富的路径操作函数,如获取父路径、拼接路径、判断路径是否存在等。
  • boost::filesystem::directory_iterator:迭代器,用于遍历指定目录下的文件和子目录。
  • boost::filesystem::remove():删除指定路径的文件或目录。
  • boost::filesystem::copy():将文件或整个目录复制到指定位置。

2、Boost.Regex(正则表达式):该模块提供了对正则表达式的支持,允许通过正则表达式在文本中进行模式匹配和搜索。

  • boost::regex:表示一个正则表达式对象。 boost::regex_match():用指定的正则表达式对字符串进行完全匹配。
  • boost::regex_search():在字符串中搜索满足正则表达式的子串。

3、Boost.DateTime(日期和时间):该模块提供了日期、时间和时间间隔的处理功能,包括日期时间的表示、计算、格式化等。

  • boost::posix_time::ptime:表示一个精确到毫秒的时间点。 boost::gregorian::date:表示一个日期。
  • boost::date_time::duration:表示一段时间间隔。
  • boost::posix_time::time_duration:表示时间的长度。
  • boost::date_time::period_formatter:用于格式化日期和时间的类。

除上述模块外,Boost库还提供了许多其他模块,包括但不限于多线程、智能指针、数学库、网络编程、序列化等。这些模块为C++开发者提供了丰富的工具和功能,方便开发高效且可靠的应用程序。

获取回收站文件信息:

#include <boost/filesystem.hpp>
#include <iostream>
namespace fs = boost::filesystem;
int main() {
    // 获取回收站的路径
    fs::path recycleBinPath = fs::path(fs::current_path()) / ".Trash";
    // 遍历回收站文件夹中的文件
    for (const auto& entry : fs::directory_iterator(recycleBinPath)) {
        // 输出文件名以及路径
        std::cout << "File: " << entry.path().stem().string() << std::endl;
        std::cout << "Path: " << entry.path().string() << std::endl;
    }
    return 0;
}

使用Boost库的boost::filesystem::rename函数将文件恢复到原始路径:

#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main() {
    // 设置恢复操作的源文件路径和目标文件夹路径
    fs::path sourceFilePath = "C:\\RecycleBin\\file.txt";
    fs::path destinationFolderPath = "C:\\OriginalPath";
    // 执行恢复操作
    fs::rename(sourceFilePath, destinationFolderPath / sourceFilePath.filename());
    return 0;
}

以上就是C++实现对回收站里的文件进行操作的示例代码的详细内容,更多关于C++操作回收站文件的资料请关注脚本之家其它相关文章!

相关文章

  • C语言实现推箱子小游戏

    C语言实现推箱子小游戏

    这篇文章主要为大家详细介绍了C语言实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Unity3D实现经典小游戏Pacman

    Unity3D实现经典小游戏Pacman

    这篇文章主要介绍了基于Unity3D制作一做个经典小游戏Pacman,文中的示例代码讲解详细,对我们学习Unity3D有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C语言实现天气信息管理系统

    C语言实现天气信息管理系统

    这篇文章主要介绍了C语言实现天气信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C语言实现冒泡排序的思路以及过程

    C语言实现冒泡排序的思路以及过程

    冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • C语言开发实现贪吃蛇游戏

    C语言开发实现贪吃蛇游戏

    这篇文章主要为大家详细介绍了C语言开发实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言中sizeof 和 strlen的区别

    C语言中sizeof 和 strlen的区别

    sizeof 和 strlen 是两个常用于 C/C++ 语言中的函数或操作符,本文主要介绍了C语言中sizeof 和 strlen的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • C++实现LeetCode(187.求重复的DNA序列)

    C++实现LeetCode(187.求重复的DNA序列)

    这篇文章主要介绍了C++实现LeetCode(187.求重复的DNA序列),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • C语言实现航班订票系统

    C语言实现航班订票系统

    这篇文章主要为大家详细介绍了C语言实现航班订票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C语言字符函数与字符串函数详解

    C语言字符函数与字符串函数详解

    这篇文章主要给大家介绍了关于C语言字符/字符串的相关函数,文中通过示例代码总结的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-09-09

最新评论