мониторинг файла на предмет изменений - PullRequest
1 голос
/ 10 сентября 2010

Я пытаюсь добиться функциональности, подобной tail , в моем приложении Visual Studio C ++.(т.е. показывать в реальном времени изменения файла, не принадлежащего моему процессу.)

/// name of the file to tail
std::string file_name_;

/// position of the last-known end of the file
std::ios::streampos file_end_;

// start by getting the position of the end of the file.
std::ifstream file( file_name_.c_str() );
if( file.is_open() )
{
    file.seekg( 0, std::ios::end );
    file_end_ = file.tellg();
}

/// callback activated when the file has changed
void Tail::OnChanged()
{
    // re-open the file
    std::ifstream file( file_name_.c_str() );
    if( file.is_open() )
    {
        // locate the current end of the file
        file.seekg( 0, std::ios::end );
        std::streampos new_end = file.tellg();

        // if the file has been added to
        if( new_end > file_end_ )
        {
            // move to the beginning of the additions
            file.seekg( 0, new_end - file_end_ );

            // read the additions to a character buffer
            size_t added = new_end - file_end_;
            std::vector< char > buffer( added + 1 );
            file.read( &buffer.front(), added );

            // display the additions to the user

            // this is always the correct number of bytes added to the file
            std::cout << "added " << added << " bytes:" << std::endl;

            // this always prints nothing
            std::cout << &buffer.front() << std::endl << std::endl;
        }

        // remember the new end of the file
        file_end_ = new_end;
    }
}

Хотя он всегда знает, сколько байтов было добавлено в файл, буфер чтения всегда пуст.Что мне нужно сделать, чтобы получить функциональность, которая мне нужна?

Спасибо, PaulH


РЕДАКТИРОВАТЬ: не имеет значения.Я получил это отсортировано.Я использовал seekg () неправильно.Вот что я должен был сделать:

if( new_end > file_end_ )
{
    size_t added = new_end - file_end_;
    file.seekg( -added, std::ios::end );

Спасибо

1 Ответ

1 голос
/ 11 сентября 2010

В Linux вы можете посмотреть inotify , чтобы получать уведомления об изменениях в файле. Он позволяет вам опрашивать или выбирать дескриптор inotify и получать уведомления при изменении файла или каталога.

...