本篇文章主要为大家详细介绍了C++如何使用代码对回收站里的文件进行操作,譬如文件的删除与恢复等。
方式一:设置不同的SHFILEOPSTRUCT结构体,调用SHFileOperation函数就可以实现拷贝、删除、移动等文件操作
SHGetSpecialFolderLocation函数:
原型:
HRESULT SHGetSpecialFolderLocation(HWND hwnd, int csidl,
PIDLIST_ABSOLUTE* ppidl)
该函数用于获取特殊文件夹的物理路径。它接受以下参数:
功能:根据给定的特殊文件夹标识符,该函数将返回与之对应的文件夹的物理路径。通过该函数获取回收站文件夹的物理路径可以进一步操作其中的文件。
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;
成员变量:
该结构描述了要进行的文件操作的详细信息,包括源文件/文件夹路径、目标路径、操作类型和标志等。传递此结构给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++操作文件系统提供了便捷且跨平台的接口,包括文件路径操作、目录遍历、文件访问等。
2、Boost.Regex(正则表达式):该模块提供了对正则表达式的支持,允许通过正则表达式在文本中进行模式匹配和搜索。
3、Boost.DateTime(日期和时间):该模块提供了日期、时间和时间间隔的处理功能,包括日期时间的表示、计算、格式化等。
除上述模块外,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;
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。