一无所知

世界如此之大,世界又如此之小!我什么都不知,只知我一无所知!

用户操作
[即时聊天] [发私信] [加为好友]
一无所知ID:Caviler
162079次访问,排名486,好友0人,关注者1人。
Caviler的文章
原创 105 篇
翻译 1 篇
转载 6 篇
评论 125 篇
一无所知的公告
主要是技术类文章和新闻
内容按创作共用方式授权
如侵犯了您的权利请告之!
  访问统计 访问统计
我正在看的书和电影:
最近评论
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
dotku:VS 2005的风格化如何操作?
wenfh2020:【编程】界面 - 皮肤界面(自画窗口标题) 这个帖子仿佛很久以前的,不知道还有源码没有,可以的话发我一份,谢谢。

我的邮箱:jom@seegle.com
xffice:比Bugtracker更强劲的EIS@xffice

http://www.xffice.com

配置型通用信息管理系统(同一系统可配置出无数应用)
(Easy Infomation System)有以下功能:
1、同一系统中,可容纳多个配置好的EIS应用。
例如:客户管理、员工管理、名片管理、进度管理、公司文档管理……
tuggfox:楼主,代码能发给我一份学习一下吗?
tuggsoft@163.com
文章分类
收藏
相册
超级搞笑
历代地图
趣图欣赏
编程手册
RFC(中文)
RFC(中文)
常用工具
Furl
Messenger
RFC(中文)
万年日历
常用站点
developerWorks
Gmail
Google Groups
Orkut
Wallop
搜索引擎
百科全书
网站历史
技术站点
CodeProject
Eclipse
RIA
我的链接
52Blog
CNDEV Blog
Wallop Blog
个人主页
我的位置
友情链接
社会性软件(RSS)
最新消息
Code Project
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 【编程】代码 - 监视文件修改(采用完成端口和ReadDirectoryChangesW同时在一个线程中监视多个目录,并且能够判断文件是否完全复制完毕)收藏

新一篇: 【编程】工具 - Compuware 全套产品的许可文件(License.xml) | 旧一篇: 【编程】技巧 - 消除 C4511 和 C4512 编译警告

今天在改进文件监视程序时写的框架代码,监视文件修改(采用完成端口和ReadDirectoryChangesW同时在一个线程中监视多个目录,并且能够判断文件是否完全复制完毕)

 

#define STRICT

 

 

#define WINVER               0x0500

#define _WIN32_WINNT 0x0500

#define _WIN32_IE           0x0501

#define _RICHEDIT_VER 0x0200

 

#define _WIN32_DCOM

 

 

#include <CTL/CTL_BASE.HPP>

 

 

class P2PFileShare

{

       typedef struct

       {

              OVERLAPPED   ov;

 

              BYTE           buff[1024];

 

              LPTSTR              path;

              DWORD             flag;

 

              HANDLE            handle;

       }PATH_OV, *LPPATH_OV;

 

       typedef struct

       {

              LPTSTR       name;     // 文件名称

              DWORD      time;       // 通知时间

       }FILE_NOTIFY;

 

public:

       P2PFileShare()

       : mh_IOCP(NULL)

       , mn_OVPtr(0)

       , mp_OVPtr(NULL)

       , mn_Notify(0)

       , mp_Notify(NULL)

       {

       }

 

       virtual~P2PFileShare()

       {

              Close(TRUE);

       }

private:

       // 创建工作线程

       HRESULT                         _CreateWorkerThread();

 

       // 工作线程

#ifndef _WIN32_WCE

       static UINT  WINAPI _WorkerThreadProc(IN LPVOID pData);

#else

       static DWORD WINAPI   _WorkerThreadProc(IN LPVOID pData);

#endif     // #ifndef _WIN32_WCE

              HRESULT           _WorkerThreadProc();

 

public:

       HRESULT           Start();

       VRESULT           Close(IN CONST BOOL bWait = FALSE);

public:

       // 监视指定目录

       HRESULT MonitorPath(IN LPCTSTR sFileName);

       // 文件变化通知

       LPTSTR       GetNotify();

private:

       HANDLE                   mh_IOCP;

 

       MLONG                     mn_OVPtr;

       LPPATH_OV*           mp_OVPtr;

 

       MLONG                     mn_Notify;

       FILE_NOTIFY*  mp_Notify;

public:

       INLINE VRESULT EnterLock() {mo_cs.EnterLock();}

       INLINE VRESULT LeaveLock() {mo_cs.LeaveLock();}

private:

       MTCSObject              mo_cs;

};

 

// 创建工作线程(根据 CPU 的数量,创建相应数量的工作线程)

HRESULT P2PFileShare::_CreateWorkerThread()

{

       HRESULT  hr = E_FAIL;

 

       HANDLE hThread;

#ifndef _WIN32_WCE

       if((hThread = (HANDLE)_beginthreadex(NULL, 0

                                          , _WorkerThreadProc

                                          , (LPVOID)this, 0, NULL)) == 0)

       {

              return _doserrno;

       }

#else

       if((hThread = (HANDLE)::CreateThread(NULL, 0

                                          , _WorkerThreadProc

                                          , (LPVOID)this, 0, &NULL)) == 0)

       {

              return ::GetLastError();

       }

#endif

       ::CloseHandle(hThread);     // 关闭句柄避免资源泄漏

       hr = S_OK;

 

       return hr;

}

 

// 工作线程

#ifndef _WIN32_WCE

UINT P2PFileShare::_WorkerThreadProc(IN LPVOID pData)

#else

DWORD P2PFileShare::_WorkerThreadProc(IN LPVOID pData)

#endif     // #ifndef _WIN32_WCE

{

       ((P2PFileShare*)pData)->_WorkerThreadProc();

 

#ifndef _WIN32_WCE

       _endthreadex(0);

#else

       ExitThread(0);

#endif

       return 0;

}

 

// 数据处理线程函数

HRESULT P2PFileShare::_WorkerThreadProc()

{

       // 注意: 调用 GetQueuedCompletionStatus 的线程都将被放到完成端口的等待线程队列中

       // 完成操作循环

 

       BOOL   bSucceed;

       DWORD      dwBytes;

      

       LPDWORD         pCT;

       PATH_OV* pOV;

 

       for(;;)

       {

              bSucceed = ::GetQueuedCompletionStatus(mh_IOCP

                                                                             , &dwBytes

                                                                             , (LPDWORD)&pCT

                                                                             , (LPOVERLAPPED*)&pOV

                                                                             , INFINITE

                                                                             );

              if(bSucceed)

              {

                     if(NULL == pOV) break;          // 退出工作线程

 

                     FILE_NOTIFY_INFORMATION * pfiNotifyInfo = (FILE_NOTIFY_INFORMATION*)pOV->buff;

 

                     DWORD dwNextEntryOffset; 

                     TCHAR sFileName[1024];

                    

                     do

                     {

                            dwNextEntryOffset = pfiNotifyInfo->NextEntryOffset;

 

                            DWORD dwAction = pfiNotifyInfo->Action; 

                            DWORD dwFileNameLength = pfiNotifyInfo->FileNameLength;

 

                            CPY_W2T(sFileName, pfiNotifyInfo->FileName, dwFileNameLength/sizeof(WCHAR));

 

                            switch(dwAction)

                            {

                            case FILE_ACTION_REMOVED:         // 文件删除

                                   {

                                          LPTSTR sFullName = new TCHAR[LPTSTRLen(pOV->path) + LPTSTRLen(sFileName) + 1];

                                          if(NULL != sFullName)

                                          {

                                                 LPTSTRCpy(sFullName, pOV->path);

                                                 LPTSTRCat(sFullName, sFileName