文件浏览器的列表更新
大家好. 我现在练习做一个文件浏览器, 类似Windows自带的资源管理器. 但是, 不知道如何对文件的删除和添加及时更新.
如果每隔一段时间, 将ListView清空, 再重新建立, 这样效率不高. 请问大家有什么好想法吗? 谢谢!
[解决办法]
给个例子好了:
#include <stdio.h>
#include <windows.h>
char srcdirnamebuf[256];
char tardirnamebuf[256];
char* tardirname;
char* srcdirname;
HANDLE chghdls[2];
void try_copy_file( char *srcdir, char *tardir, WIN32_FIND_DATA* wfd )
{
HANDLE tarfhdl;
FILETIME filetime;
char tarfilename[256];
char srcfilename[256];
sprintf( tarfilename, "%s\\%s ", tardir, wfd-> cFileName );
sprintf( srcfilename, "%s\\%s ", srcdir, wfd-> cFileName );
printf( "%s-> %s\n ", srcfilename, tarfilename );
tarfhdl = CreateFile( tarfilename,
STANDARD_RIGHTS_ALL,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
wfd-> dwFileAttributes,
INVALID_HANDLE_VALUE );
if( tarfhdl == INVALID_HANDLE_VALUE )
{
if( GetLastError() == ERROR_FILE_NOT_FOUND )
{
CopyFile( srcfilename, tarfilename, TRUE );
printf( "Copy file:%s\n ", tarfilename );
}
else
{
printf( "CreateFile%d\n ", GetLastError() );
}
}
else
{
GetFileTime( tarfhdl, NULL, NULL, &filetime );
CloseHandle( tarfhdl );
if( filetime.dwLowDateTime < wfd-> ftLastWriteTime.dwLowDateTime ||
filetime.dwHighDateTime < wfd-> ftLastWriteTime.dwHighDateTime )
{
CopyFile( srcfilename, tarfilename, FALSE );
SetFileTime( tarfhdl, NULL, NULL, &wfd-> ftLastWriteTime );
printf( "Merge file:%s-> %s\n ", srcfilename, tarfilename );
}
else if( filetime.dwLowDateTime > wfd-> ftLastWriteTime.dwLowDateTime ||
filetime.dwHighDateTime > wfd-> ftLastWriteTime.dwHighDateTime )
{
CopyFile( tarfilename, srcfilename, FALSE );
SetFileTime( tarfhdl, NULL, NULL, &filetime );
printf( "Merge file:%s-> S\n ", tarfilename, srcfilename );
}
}
}
void merg_copy_dir( char* srcdir, char* tardir )
{
HANDLE searchhdl, tarfhdl;
FILETIME filetime;
WIN32_FIND_DATA srcwfd;
char searchname[256];
sprintf( searchname, "%s\\* ", srcdir );
if( ( searchhdl = FindFirstFile( searchname, &srcwfd ) ) == INVALID_HANDLE_VALUE )
{
printf( "Copy directroy failed:FindFirstFile%d\n ", GetLastError() );
return;
}
try_copy_file( srcdir, tardir, &srcwfd );
while( FindNextFile( searchhdl, &srcwfd ) )
{
try_copy_file( srcdir, tardir, &srcwfd );
}
FindClose( searchhdl );
}
void guard_func( void *dummy )
{
while (TRUE)
{
switch( WaitForMultipleObjects( 2, chghdls, FALSE, INFINITE ) )
{
case WAIT_OBJECT_0:
printf( "Directory(%s)change detected!\n ", srcdirname );
merg_copy_dir( srcdirname, tardirname );
merg_copy_dir( tardirname, srcdirname );
FindNextChangeNotification( chghdls[0] );
break;
case WAIT_OBJECT_0 + 1:
printf( "Directory(%s)change detected!\n ", tardirname );
merg_copy_dir( tardirname, srcdirname );
merg_copy_dir( srcdirname, tardirname );
FindNextChangeNotification( chghdls[1] );
break;
}
}
}
int main( int argc, char *argv[ ] )
{
if (argc != 3)
{
printf( "Please input 1st Directory you want to guard: " );
scanf( "%s ", srcdirnamebuf );
srcdirname = srcdirnamebuf;
printf( "Please input 2nd Directory you want to guard: " );
scanf( "%s ", tardirnamebuf );
tardirname = tardirnamebuf;
}
else
{
srcdirname = argv[1];
tardirname = argv[2];
}
chghdls[0] = FindFirstChangeNotification( srcdirname,
FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES |
FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE |
FILE_NOTIFY_CHANGE_SECURITY );
if (chghdls[0] == INVALID_HANDLE_VALUE)
{
printf( "Error:%d\n ", GetLastError() );
exit( 1 );
}
chghdls[1] = FindFirstChangeNotification( tardirname,
FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES |
FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE |
FILE_NOTIFY_CHANGE_SECURITY );
if (chghdls[1] == INVALID_HANDLE_VALUE)
{
printf( "Error:%d\n ", GetLastError() );
exit( 1 );
}
_beginthread( guard_func, 0, NULL );
printf( "Gurading...Press Q to stop... " );
while( getchar( ) != 'Q ' );
FindCloseChangeNotification( chghdls[0] );
FindCloseChangeNotification( chghdls[1] );
system( "PAUSE " );
return;
}