1,监控请看:http://www.vckbase.com/document/viewdoc/?id=845
2.你可以定义全局变量,记录上一次文件末尾位置

解决方案 »

  1.   

    一、ReadDirectoryChangesW 可以监控一个文件夹 在MFC里面怎么使用?
    =======================================================================
    ReadDirectoryChangesW并不能在win2k以前的系统中使用,兼容性不好,且你的需求不需要使用该api可以用
    FindFirstChangeNotification
    FindNextChangeNotification
    FindCloseChangeNotification以下是个使用的例子:#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;

    }