C++ 学習「コードを使用してごみ箱内のファイルを操作する方法」

方法 1: 異なる SHFILEOPSTRUCT 構造体を設定し、SHFileOperation 関数を呼び出して、コピー、削除、移動などのファイル操作を実装します。

SHGetSpecialFolderLocation 関数:

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

この関数は、特別なフォルダーの物理パスを取得するために使用されます。次のパラメータを受け入れます。

hwnd: オプションのパラメータ。親ウィンドウのハンドルを指定します。ウィンドウの関連付けが必要ない場合は、NULL に設定できます。
csidl: 取得するフォルダを指定する特殊フォルダ(CSIDL)の識別子を示します。
ppidl: フォルダーの ITEMIDLIST を受け取るために使用される PIDLIST_ABSOLUTE 型へのポインター。
機能: この関数は、指定された特別なフォルダー識別子に従って、対応するフォルダーの物理パスを返します。この機能を使用してごみ箱フォルダーの物理パスを取得すると、その中のファイルをさらに操作できます。

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 fAny 操作が中止されました。LPVOID hNameMappings; LPCWSTR lpszProgressTitle; SHFILEOPSTRUCT、*LPSHILEOPSTRUCT;








メンバー変数:

hwnd: 親ウィンドウのハンドルを示すオプションのパラメータ。wFunc: コピー、移動、削除など、実行されるファイル操作のタイプを示します。
pFrom: ソース ファイル/フォルダーを指すパス文字列。pTo: ターゲットのファイル/フォルダーのパス文字列を指します。
fFlags: FOF_ALLOWUNDO、FOF_NOCONFIRMATION などのファイル操作を制御するフラグ ビット。
fAnyOperationsAborted: 操作がユーザーによってキャンセルされた場合は TRUE。
hNameMappings: 予約パラメータ。NULL に設定する必要があります。lpszProgressTitle: 進行状況ダイアログにカスタム タイトルを表示するためのオプションのパラメーター。

この構造には、ソース ファイル/フォルダー パス、ターゲット パス、操作タイプ、フラグなど、実行されるファイル操作の詳細が記述されます。この構造体を SHFileOperation 関数に渡して、対応するファイル操作を実行します。

コード例:

シェル API の使用: Windows シェル 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;
}

シェル 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);  // 释放内存
    
   ;
}

方法 2: 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;
}

Boost ライブラリの開発と適用事例については、Luo Jianfeng 氏の「Exploring the Boost Library: In- Depth Analysis of the C++ Quasi-Standard Library」を参照してください。関連書籍は 2 冊あるようです。どちらも彼が書いたものなので、友達ならもっと詳しく知ることができます。

おすすめ

転載: blog.csdn.net/u014740628/article/details/131362399