⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileprobe.h

📁 一个网络监视的程序
💻 H
字号:
#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <string>
#include <cassert>

enum ACTION { ADDED=1, REMOVED=2, MODIFIED=3, RENAMED=4 };
class FileProbe
{
public:
    typedef void (__stdcall *LPOUTPUT)( ACTION act, std::string filename1, std::string filename2 );

	bool Start( std::string path, LPOUTPUT output )
	{
        WatchedDir = path;
        DealFun = output;
		
        DWORD ThreadId;
        hThread=CreateThread( NULL,0,Routine,this,0,&ThreadId );
        return NULL!=hThread;
	} 
	void Stop()
	{
		if( NULL != hThread )
		{
			TerminateThread( hThread, 0 );
			hThread = NULL;
		}
		if( INVALID_HANDLE_VALUE != hDir )
		{
			CloseHandle( hDir );
			hDir = INVALID_HANDLE_VALUE;
		}
	}
	FileProbe::FileProbe():DealFun(NULL), hThread(NULL), hDir(INVALID_HANDLE_VALUE)
    {
    }
    ~FileProbe()
    {
       	  Stop();
    }

private:
    std::string WatchedDir;
    LPOUTPUT DealFun;
    HANDLE hThread;
    HANDLE hDir;
private:
    FileProbe( const FileProbe& );
    FileProbe operator=( const FileProbe );
private:
    static DWORD WINAPI Routine( LPVOID lParam )
    {
        FileProbe* obj = (FileProbe*)lParam;

        obj->hDir = CreateFile(
            obj->WatchedDir.c_str(),
            GENERIC_READ|GENERIC_WRITE,
            FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
            NULL,
            OPEN_EXISTING,
            FILE_FLAG_BACKUP_SEMANTICS,
            NULL
        );
        if( INVALID_HANDLE_VALUE == obj->hDir ) return false;

        char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ];
        FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf;
        DWORD BytesReturned;
        while(true)
        {
            if( ReadDirectoryChangesW( obj->hDir,
                pNotify,
                sizeof(buf),
                true,
                FILE_NOTIFY_CHANGE_FILE_NAME|
                FILE_NOTIFY_CHANGE_DIR_NAME|
                FILE_NOTIFY_CHANGE_ATTRIBUTES|
                FILE_NOTIFY_CHANGE_SIZE|
                FILE_NOTIFY_CHANGE_LAST_WRITE|
                FILE_NOTIFY_CHANGE_LAST_ACCESS|
                FILE_NOTIFY_CHANGE_CREATION|
                FILE_NOTIFY_CHANGE_SECURITY,
                &BytesReturned,
                NULL,
                NULL ) )
            {
                char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
                memset( tmp, 0, sizeof(tmp) );
                WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
                strcpy( str1, tmp );

                if( 0 != pNotify->NextEntryOffset )
                {
                    PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
                    memset( tmp, 0, sizeof(tmp) );
                    WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
                    strcpy( str2, tmp );
                }

                obj->DealFun( (ACTION)pNotify->Action, str1, str2 );
            }
            else
            {
                break;
            }
        }

        return 0;
    }
};


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -