C++實(shí)現(xiàn)對回收站里的文件進(jìn)行操作的示例代碼
方式一:設(shè)置不同的SHFILEOPSTRUCT結(jié)構(gòu)體,調(diào)用SHFileOperation函數(shù)就可以實(shí)現(xiàn)拷貝、刪除、移動等文件操作
SHGetSpecialFolderLocation函數(shù):
原型:
HRESULT SHGetSpecialFolderLocation(HWND hwnd, int csidl,
PIDLIST_ABSOLUTE* ppidl)
該函數(shù)用于獲取特殊文件夾的物理路徑。它接受以下參數(shù):
- hwnd:可選參數(shù),指定父窗口的句柄。如果不需要與窗口關(guān)聯(lián),可以設(shè)置為NULL。
- csidl:表示特殊文件夾的標(biāo)識符(CSIDL),用于指定要獲取的文件夾。
- ppidl:一個指向PIDLIST_ABSOLUTE類型的指針,用于接收文件夾的ITEMIDLIST。
功能:根據(jù)給定的特殊文件夾標(biāo)識符,該函數(shù)將返回與之對應(yīng)的文件夾的物理路徑。通過該函數(shù)獲取回收站文件夾的物理路徑可以進(jìn)一步操作其中的文件。
SHGetPathFromIDList函數(shù):
原型:
BOOL SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl, LPWSTR pszPath)
該函數(shù)用于根據(jù)ITEMIDLIST(在這里是通過SHGetSpecialFolderLocation獲得的PIDLIST_ABSOLUTE)返回文件夾的路徑。
功能:該函數(shù)將ITEMIDLIST轉(zhuǎn)換為文件夾的字符串路徑。
SHFileOperation函數(shù):
原型:
int SHFileOperation(const SHFILEOPSTRUCT* lpFileOp)
該函數(shù)用于執(zhí)行文件操作,如復(fù)制、移動和刪除等。它接受以下參數(shù):
lpFileOp:指向SHFILEOPSTRUCT結(jié)構(gòu)的指針,描述要執(zhí)行的文件操作。
功能:該函數(shù)執(zhí)行文件操作,可以將文件復(fù)制、移動或刪除到指定位置,包括回收站??梢栽O(shè)置FOF_ALLOWUNDO標(biāo)志以啟用撤銷功能。
SHFILEOPSTRUCT結(jié)構(gòu)體:
定義:
typedef struct _SHFILEOPSTRUCT
{
HWND hwnd;
UINT wFunc;
LPCWSTR pFrom;
LPCWSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCWSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
成員變量:
- hwnd:可選參數(shù),表示父窗口的句柄。 wFunc:表示要執(zhí)行的文件操作類型,如復(fù)制、移動、刪除等。
- pFrom:指向源文件/文件夾的路徑字符串。 pTo:指向目標(biāo)文件/文件夾路徑字符串。
- fFlags:控制文件操作的標(biāo)志位,如FOF_ALLOWUNDO、FOF_NOCONFIRMATION等。
- fAnyOperationsAborted:如果用戶取消了任何一個操作,則為TRUE。
- hNameMappings:保留參數(shù),應(yīng)設(shè)置為NULL。 lpszProgressTitle:可選參數(shù),用于在進(jìn)度對話框中顯示自定義標(biāo)題。
該結(jié)構(gòu)描述了要進(jìn)行的文件操作的詳細(xì)信息,包括源文件/文件夾路徑、目標(biāo)路徑、操作類型和標(biāo)志等。傳遞此結(jié)構(gòu)給SHFileOperation函數(shù)可執(zhí)行相應(yīng)的文件操作。
代碼示例:
使用Shell API:你可以使用Windows的Shell API來訪問回收站,并獲取回收的文件信息。
1、使用SHGetSpecialFolderLocation函數(shù)通過指定回收站的CSIDL_BITBUCKET標(biāo)識符來獲取回收站的物理路徑。
2、使用SHGetPathFromIDList函數(shù)將回收站路徑轉(zhuǎn)換為字符串格式存儲在sFolderPath中。
3、構(gòu)建搜索路徑sSearchPath,用于遍歷回收站文件夾中的文件。
4、使用FindFirstFile和FindNextFile函數(shù)遍歷回收站文件夾中的每個文件。
5、對于每個文件,使用_tprintf函數(shù)在控制臺上輸出其文件名和完整路徑。
6、最后使用FindClose關(guān)閉文件搜索句柄。
#include <Windows.h> #include <ShlObj.h> int main() { // 獲取回收站的路徑 LPITEMIDLIST pidlBin; SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlBin); // 將回收站的路徑轉(zhuǎn)換為字符串格式 TCHAR szFolderPath[MAX_PATH]; SHGetPathFromIDList(pidlBin, szFolderPath); // 構(gòu)建搜索路徑 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結(jié)構(gòu)和SHFileOperation函數(shù)來執(zhí)行文件操作,包括將文件恢復(fù)到原始路徑。
#include <Windows.h> #include <ShlObj.h> int main() { // 設(shè)置恢復(fù)操作的源文件路徑和目標(biāo)文件夾路徑 TCHAR szSourceFilePath[] = _T("C:\\RecycleBin\\file.txt"); TCHAR szDestinationFolderPath[] = _T("C:\\OriginalPath"); // 構(gòu)建SHFILEOPSTRUCT結(jié)構(gòu) SHFILEOPSTRUCT fileOpStruct; ZeroMemory(&fileOpStruct, sizeof(SHFILEOPSTRUCT)); fileOpStruct.wFunc =_RENAME; fileOpStruct.pFrom = szSourceFilePath; fileOpStruct.pTo = szDestinationFolderPath; fileOpStruct.fFlags = FOF_ALLOWUNDO; // 執(zhí)行恢復(fù)操作 int result = SHFileOperation(&fileOpStruct); if (result == 0) { // 恢復(fù)成功 // ... } return 0; }
刪除回收站里的文件:
#include <Windows.h> #include <Shlobj.h> #include <iostream> int main() { LPITEMIDLIST pidlBin; SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlBin); // 構(gòu)建文件操作的結(jié)構(gòu)體 SHFILEOPSTRUCT fileOpStruct; ZeroMemory(&fileOpStruct, sizeof(SHFILEOPSTRUCT)); fileOpStruct.hwnd = NULL; // 父窗口句柄(可選) fileOpStruct.wFunc = FO_DELETE; // 執(zhí)行刪除OpStruct.pFrom = reinterpret_cast<LPCWSTR>(pidlBin); // 源文件路徑 fileOpStruct.fFlags = FOF_ALLOWUNDO | FOF_NO_UI; // 標(biāo)志位 int result = SHFileOperation(&fileOpStruct); // 執(zhí)行文件操作 if (result == 0 && !fileOpStruct.fAnyOperationsAborted) { std::cout << "文件刪除成功!" << std::endl; } else { std::cerr << "文件刪除失?。? << result << std::endl; } CoTaskMemFree(pidlBin); // 釋放內(nèi)存 ; }
方式二:使用第三方庫,例如Boost和Qt等,它供了更高級的文件系統(tǒng)操作接口
以Boost庫為例:
Boost是一個開源的C++庫集合,增強(qiáng)功能和性能。它提供了許多高質(zhì)量、可移植且經(jīng)過廣泛測試的模塊和組件,覆蓋了從基本數(shù)據(jù)結(jié)構(gòu)到高級功能的各個方面。下面是Boost庫中一些常用模塊和其功能的簡要介紹:
1、Boost.Filesystem(文件系統(tǒng)):該模塊為C++操作文件系統(tǒng)提供了便捷且跨平臺的接口,包括文件路徑操作、目錄遍歷、文件訪問等。
- boost::filesystem::path:表示文件或目錄的路徑,提供了豐富的路徑操作函數(shù),如獲取父路徑、拼接路徑、判斷路徑是否存在等。
- boost::filesystem::directory_iterator:迭代器,用于遍歷指定目錄下的文件和子目錄。
- boost::filesystem::remove():刪除指定路徑的文件或目錄。
- boost::filesystem::copy():將文件或整個目錄復(fù)制到指定位置。
2、Boost.Regex(正則表達(dá)式):該模塊提供了對正則表達(dá)式的支持,允許通過正則表達(dá)式在文本中進(jìn)行模式匹配和搜索。
- boost::regex:表示一個正則表達(dá)式對象。 boost::regex_match():用指定的正則表達(dá)式對字符串進(jìn)行完全匹配。
- boost::regex_search():在字符串中搜索滿足正則表達(dá)式的子串。
3、Boost.DateTime(日期和時間):該模塊提供了日期、時間和時間間隔的處理功能,包括日期時間的表示、計(jì)算、格式化等。
- boost::posix_time::ptime:表示一個精確到毫秒的時間點(diǎn)。 boost::gregorian::date:表示一個日期。
- boost::date_time::duration:表示一段時間間隔。
- boost::posix_time::time_duration:表示時間的長度。
- boost::date_time::period_formatter:用于格式化日期和時間的類。
除上述模塊外,Boost庫還提供了許多其他模塊,包括但不限于多線程、智能指針、數(shù)學(xué)庫、網(wǎng)絡(luò)編程、序列化等。這些模塊為C++開發(fā)者提供了豐富的工具和功能,方便開發(fā)高效且可靠的應(yīng)用程序。
獲取回收站文件信息:
#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函數(shù)將文件恢復(fù)到原始路徑:
#include <boost/filesystem.hpp> namespace fs = boost::filesystem; int main() { // 設(shè)置恢復(fù)操作的源文件路徑和目標(biāo)文件夾路徑 fs::path sourceFilePath = "C:\\RecycleBin\\file.txt"; fs::path destinationFolderPath = "C:\\OriginalPath"; // 執(zhí)行恢復(fù)操作 fs::rename(sourceFilePath, destinationFolderPath / sourceFilePath.filename()); return 0; }
以上就是C++實(shí)現(xiàn)對回收站里的文件進(jìn)行操作的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++操作回收站文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法
今天小編就為大家分享一篇關(guān)于C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02搭建C語言開發(fā)環(huán)境(Windows平臺)匯總
本文給大家匯總了5種在WIN平臺下搭建C語言開發(fā)環(huán)境的方法,包括一、在Windows平臺配置GNU環(huán)境,二、使用Sublime Test開發(fā)C語言程序,三、使用VisualStudio開發(fā)C語言程序,四、搭建EclipseCDT集成開發(fā)環(huán)境,五、搭建Clion集成開發(fā)環(huán)境,有需要的小伙伴可以參考下2015-11-11select函數(shù)實(shí)現(xiàn)高性能IO多路訪問的關(guān)鍵示例深入解析
這篇文章主要為大家介紹了select函數(shù)實(shí)現(xiàn)高性能IO多路訪問的關(guān)鍵示例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09C++實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11在matlab中實(shí)現(xiàn)for循環(huán)的方法
for循環(huán)用來循環(huán)處理數(shù)據(jù),break用于終止離它最近的一層for循環(huán),continue用于跳過離它最近的一層for循環(huán),接著執(zhí)行下一次循環(huán),本文重點(diǎn)給大家介紹在matlab中實(shí)現(xiàn)for循環(huán)的方法,感興趣的朋友一起看看吧2021-11-11詳解C語言中結(jié)構(gòu)體(struct)的用法
這篇文章主要為大家詳細(xì)介紹了C語言中結(jié)構(gòu)體(struct)的用法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2022-08-08