首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于更新ListView有关问题

2012-01-19 
关于更新ListView问题大家好!自己做了一个类似资源管理器的Dialog,但不能实时更新ListView中生成的文件,请

关于更新ListView问题
大家好!自己做了一个类似资源管理器的Dialog,但不能实时更新ListView中生成的文件,请问是否还需要调用什么更新函数什么的?我在调用后,虽然执行了UpdateListView   和AddToListView,但List中没有更新。
/********************************************************************/
/**/
/*   Function   name   :   UpdateListView*/
/*   Description       :   Update   the   list   view.   */
/**/
/********************************************************************/
void   CBrowseFilesPage::UpdateListView(CString   strPathName)
{
m_List.DeleteAllItems();

        HANDLE   hFind;
        WIN32_FIND_DATA   fd;
        BOOL   bResult   =   FALSE;

        CString   strFileSpec   =   strPathName;
        if   (strFileSpec.Right   (1)   !=   "\\ ")
                strFileSpec   +=   "\\ ";
        strFileSpec   +=   "*.* ";

SetCurrentDirectory(strFileSpec);

m_iFileCount   =   0;
m_iDirectoryCount   =   0;
        if   ((hFind   =   ::FindFirstFile   ((LPCTSTR)   strFileSpec,   &fd))   !=   INVALID_HANDLE_VALUE)
        {
                do  
{
                        CString   strFileName   =   (LPCTSTR)   &fd.cFileName;
/*   folder   */
                        if   (fd.dwFileAttributes   &   FILE_ATTRIBUTE_DIRECTORY)  
{
                                if   ((strFileName   !=   ". ")   &&   (strFileName   !=   ".. "))
{
AddToListView(&fd   ,   ICI_CLSDFLD,   " <File   Folder> ");
m_iDirectoryCount++;
}
}
/*   file   */
else
{
AddToListView(&fd   ,   GetListViewIcon(strFileName),   GetFileType(fd.cFileName));//modify
m_iFileCount++;
}
}   while   (::FindNextFile   (hFind,   &fd)   &&   !bResult);

              ::FindClose   (hFind);
}
}


/********************************************************************/
/**/
/*   Function   name   :   AddToListView*/
/*   Description       :   Add   folder   &   files   to   list.*/
/**/
/********************************************************************/
void   CBrowseFilesPage::AddToListView(WIN32_FIND_DATA   *fd,   int   iImage,   CString   cAttrib)
{
LV_ITEMlvitem;
char   sNumBuff[100];
int   iActualItem;
CString   sText;
char   filename[MAX_PATH];
lstrcpy(filename   ,   fd-> cFileName);
char   attrib[MAX_PATH];
lstrcpy(attrib   ,   cAttrib);

//   Add   No.0   column   -   Name
lvitem.mask   =   LVIF_TEXT   |   LVIF_IMAGE;


lvitem.iItem   =   0;
lvitem.iSubItem   =   0;
lvitem.pszText   =     filename;   //     fd.cFileName;
lvitem.iImage   =   iImage;   //   GetListViewIcon(fd-> cFileName);   //SetFileIcon(fd-> GetFileName());
iActualItem   =   m_List.InsertItem(&lvitem);

//   Add   No.1   column   -   Size
if(fd-> nFileSizeLow   !=   0)
ltoa((long)fd-> nFileSizeLow,sNumBuff,10);
else
strcpy(sNumBuff, " ");
lvitem.mask   =   LVIF_TEXT;
lvitem.iItem   =   iActualItem;
lvitem.iSubItem   =   1;
lvitem.pszText   =   sNumBuff;
m_List.SetItem(&lvitem);

//   Add   No.2   column   -   Attribute
lvitem.mask   =   LVIF_TEXT;
lvitem.iItem   =   iActualItem;
lvitem.iSubItem   =   2;
lvitem.pszText   =   attrib;    
m_List.SetItem(&lvitem);

//   Add   No.3   column   -   Time
CTime   refTime;
refTime   =   fd-> ftCreationTime;
sText   =   refTime.Format(   "%b-%d-%Y "   );
lvitem.mask   =   LVIF_TEXT;
lvitem.iItem   =   iActualItem;
lvitem.iSubItem   =   3;
lvitem.pszText   =   sText.GetBuffer(sText.GetLength());
m_List.SetItem(&lvitem);
}

[解决办法]
要实时更新,方法有两个
1. 使用定时器 -- 隔一段时间扫描一次当前正打开的文件夹属性,如果发现文件夹中的子文件夹或文件数目改变,就刷新一次listView

2. 捕获磁盘消息 -- 接收到磁盘上文件创建修改删除的消息,就刷新一次listView
[解决办法]
另开线程 实时更新下
(好像也不怎么好...)
[解决办法]

这个绝对不是单线程能完成的事情。

考虑后台开一个工作线程监视当前文件夹吧。

热点排行