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

文件浏览器的列表更新,该如何处理

2012-01-24 
文件浏览器的列表更新大家好.我现在练习做一个文件浏览器,类似Windows自带的资源管理器.但是,不知道如何对

文件浏览器的列表更新
大家好.   我现在练习做一个文件浏览器,   类似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;

}

热点排行