关于更新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
[解决办法]
另开线程 实时更新下
(好像也不怎么好...)
[解决办法]
这个绝对不是单线程能完成的事情。
考虑后台开一个工作线程监视当前文件夹吧。