为什么我改一个文件内容,会出现两次
还有如果我改了子目录。为什么只能获取子目录名?
UINT MyThreadProc( LPVOID pParam )
{
::CtestDirDlg *PWnd=(CtestDirDlg*)pParam;
HANDLE hDir=CreateFile(_T("D:\\arswp"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
if(INVALID_HANDLE_VALUE==hDir)
{
PWnd->MessageBox("指定的文件目录不存在!");
}
else
{
char buf[50*sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH];
::FILE_NOTIFY_INFORMATION * pNotify=(FILE_NOTIFY_INFORMATION*)buf;
DWORD BytesReturned;
while(true)
{
if(ReadDirectoryChangesW(hDir,pNotify,sizeof(buf),true,
FILE_NOTIFY_CHANGE_LAST_WRITE,//FILE_NOTIFY_CHANGE_CREATION|
&BytesReturned,NULL,NULL))
{
char tmp[MAX_PATH],str1[MAX_PATH],str2[MAX_PATH];
memset(tmp,0,sizeof(tmp));
bool hasNext=true;
do{
WideCharToMultiByte(CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL);
strcpy(str1,tmp);
::CEdit* pEdit=(::CEdit*)PWnd->GetDlgItem(IDC_EDIT1); CString str;
pEdit->GetWindowText(str);
str=str+"\r\n"+str1;
pEdit->SetWindowText(str);
if(pNotify->NextEntryOffset>0)
{
hasNext=true;
}
else
{
hasNext=false;
}
pNotify=(FILE_NOTIFY_INFORMATION*)((char*)pNotify+pNotify->NextEntryOffset);
}while(pNotify->NextEntryOffset>0);
}
}
}
return 0;
}
BOOL CtestDirDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 AfxBeginThread(MyThreadProc,this);
// TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
为什么我改一个文件内容,会出现两次
还有如果我改了子目录。为什么只能获取子目录名?
还有如果我改了子目录。为什么只能获取子目录名?
UINT MyThreadProc( LPVOID pParam )
{
::CtestDirDlg *PWnd=(CtestDirDlg*)pParam;
HANDLE hDir=CreateFile(_T("D:\\arswp"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
if(INVALID_HANDLE_VALUE==hDir)
{
PWnd->MessageBox("指定的文件目录不存在!");
}
else
{
char buf[50*sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH];
::FILE_NOTIFY_INFORMATION * pNotify=(FILE_NOTIFY_INFORMATION*)buf;
DWORD BytesReturned;
while(true)
{
if(ReadDirectoryChangesW(hDir,pNotify,sizeof(buf),true,
FILE_NOTIFY_CHANGE_LAST_WRITE,//FILE_NOTIFY_CHANGE_CREATION|
&BytesReturned,NULL,NULL))
{
char tmp[MAX_PATH],str1[MAX_PATH],str2[MAX_PATH];
memset(tmp,0,sizeof(tmp));
bool hasNext=true;
do{
WideCharToMultiByte(CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL);
strcpy(str1,tmp);
::CEdit* pEdit=(::CEdit*)PWnd->GetDlgItem(IDC_EDIT1); CString str;
pEdit->GetWindowText(str);
str=str+"\r\n"+str1;
pEdit->SetWindowText(str);
if(pNotify->NextEntryOffset>0)
{
hasNext=true;
}
else
{
hasNext=false;
}
pNotify=(FILE_NOTIFY_INFORMATION*)((char*)pNotify+pNotify->NextEntryOffset);
}while(pNotify->NextEntryOffset>0);
}
}
}
return 0;
}
BOOL CtestDirDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 AfxBeginThread(MyThreadProc,this);
// TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
为什么我改一个文件内容,会出现两次
还有如果我改了子目录。为什么只能获取子目录名?
2 通知而已,给个名字很不错了,为了提高效率,好多时候连文件名字都不给的。