ソフトウェアを開発し続けて早六年。 バグを憎んで人を憎まず。。 株式投資で脱サラをめざすITエンジニアのホームページ......
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
ォルダを監視して、ファイルの追加,変更,削除を検出します。
これをビルドするだけでも結構実用的なものができます。
grepと組み合わせて使えば、便利です。
特定のプログラムを動かしたときに変更されるファイルを見つけたりするときとか。。。
っていうか、自分で必要だったんで作りました。


001 #define _WIN32_WINNT 0x0500//なんか←これ書かないとReadDirectoryChangesWが見つけられない
002 #include <windows.h>
003 #pragma comment(lib, "shlwapi.lib")
004 #include <shlwapi.h>
005 #include <iostream>
006
007 static HANDLE s_hFolder;
008
009 //終了時に呼ばれる(予定だったけど。Ctrl+Cで終了すると、呼ばれなかった)
010 static void OnExit(){
011 ::CloseHandle(s_hFolder);
012 std::cerr << "close." << std::endl;
013 }
014
015 int wmain(int argc, wchar_t* argv[])
016 {
017 //ターゲットのディレクトリ
018 wchar_t targetDirectory[MAX_PATH];
019 if(argc < 2){
020 //引数なしだとカレントディレクトリが対象
021 ::GetCurrentDirectoryW(MAX_PATH, targetDirectory);
022 }else{
023 wcscpy(targetDirectory, argv[1]);
024 }
025 //対象のフォルダを開く
026 s_hFolder = ::CreateFile(targetDirectory, FILE_LIST_DIRECTORY,
027 FILE_SHARE_READ | FILE_SHARE_DELETE,
028 NULL, OPEN_EXISTING,
029 FILE_FLAG_BACKUP_SEMANTICS, NULL);
030 if(s_hFolder == INVALID_HANDLE_VALUE){
031 //オープン失敗
032 std::cerr << "invalid folder.(" << targetDirectory << ")" << std::endl;
033 return -1;
034 }
035 atexit(OnExit);
036
037 BYTE buf[1024];
038 DWORD dwReturned = 0;
039 wchar_t fileName[MAX_PATH];
040 wchar_t fullName[MAX_PATH];
041 for(;;){
042 //フォルダの変更を監視
043 if(!::ReadDirectoryChangesW(s_hFolder, buf, sizeof(buf),
044 TRUE, FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME, &dwReturned, NULL, NULL))
045 {
046 continue;
047 }
048 if(dwReturned == 0){
049 continue;
050 }
051 DWORD dwNext = 0;
052 for(;;){
053 FILE_NOTIFY_INFORMATION* pInfo = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(buf + dwNext);
054 //変更のあったファイル(s_hFolderからの相対パス)を取得。
055 //(末尾に\0が入ってない)
056 wcsncpy(fileName, pInfo->FileName, pInfo->FileNameLength / sizeof(wchar_t));
057 fileName[pInfo->FileNameLength / sizeof(wchar_t)] = '\0';
058 //フルパスにする
059 wcscpy(fullName, targetDirectory);
060 ::PathAppendW(fullName, fileName);
061 //変更があったのが、ディレクトリだったら飛ばす
062 if(!::PathIsDirectoryW(fullName)){
063 const char* state = NULL;
064 switch(pInfo->Action){
065 case FILE_ACTION_ADDED://追加された
066 std::cout << "[Add]";
067 break;
068 case FILE_ACTION_MODIFIED://変更された
069 std::cout << "[Mod]";
070 break;
071 case FILE_ACTION_REMOVED://削除された
072 std::cout << "[Rem]";
073 break;
074 case FILE_ACTION_RENAMED_OLD_NAME://リネームされた(変更前のファイル名)
075 std::cout << "[RenameOld]";
076 break;
077 case FILE_ACTION_RENAMED_NEW_NAME://リネームされた(変更後のファイル名)
078 std::cout << "[RenameNew]";
079 break;
080 default://予期せぬステータスが返ってきた
081 std::cerr << "invalid action.(" << pInfo->Action << ")" << std::endl;
082 continue;
083 }
084 std::wcout << fileName << std::endl;
085 }
086 if(NULL == pInfo->NextEntryOffset){
087 break;
088 }
089 dwNext += pInfo->NextEntryOffset;
090 }
091 ::Sleep(10);
092 }
093 return 0;
094 }

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ


管理者にだけ表示を許可する
http://qnd.blog36.fc2.com/tb.php/14-f6b8101e
この記事にトラックバックする(FC2ブログユーザー)
// HOME // 
シャトー・フルール・ド・ジャン・ゲイ・レゼルヴ 2001
↑これ、お気に入りのワインです
毎日ペースで飲んでる中からの
厳選(?)チョイスする予定。。
(ちなみに赤が好き)
カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム
ブログ内検索

RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。