Как я читаю файл, который постоянно обновляет?

Да, это может быть сделано, пока оба окна находятся на том же домене. window.open () функция возвратит дескриптор новому окну. Дочернее окно может получить доступ к родительскому окну с помощью элемента DOM "новичок".

14
задан simbabque 3 January 2017 в 10:38
поделиться

6 ответов

В Perl вы можете использовать seek и tell для чтения из постоянно растущего файла. Это может выглядеть примерно так (широко заимствовано из perldoc -f seek )

open(FH,'<',$the_file) || handle_error();  # typical open call
for (;;) {
    while (<FH>) {
        # ... process $_ and do something with it ...
    }
    # eof reached on FH, but wait a second and maybe there will be more output
    sleep 1;
    seek FH, 0, 1;      # this clears the eof flag on FH
}
24
ответ дан 1 December 2019 в 07:27
поделиться

В Perl есть несколько модулей, которые упрощают отслеживание файла. IO :: Tail и File :: Tail один использует обратный вызов, другой - блокирующее чтение, так что это просто зависит от того, что лучше соответствует вашим потребностям. Вероятно, существуют и другие хвостовые модули, но это два, которые пришли в голову.

IO :: Tail - следовать за хвостом файлов / потока

 use IO::Tail;
 my $tail = IO::Tail->new();
 $tail->add('test.log', \&callback);
 $tail->check();
 $tail->loop();

File :: Tail - расширение Perl для чтение из постоянно обновляемых файлов

use File::Tail;
my $file = File::Tail->new("/some/log/file");
while (defined(my $line= $file->read)) {
    print $line;
}
9
ответ дан 1 December 2019 в 07:27
поделиться

Вы говорите об открытии файла и спрашиваете о IO :: Socket . Это не совсем то же самое, даже если в глубине души вы собираетесь читать данные из файлового дескриптора.

Если вы можете получить доступ к удаленному потоку из именованного канала или FIFO, вы можете просто открыть его как обычный файл. Он будет блокироваться, когда ничего не доступно, и возвращаться всякий раз, когда есть данные, которые необходимо удалить. Возможно, вам придется использовать File :: Tail , а может и нет, чтобы решить проблему сохранения данных, если отправитель окажется слишком далеко впереди вас.

С другой стороны, если вы ' При открытии сокета напрямую другому серверу (что кажется более вероятным), IO :: Socket не будет работать из коробки, поскольку недоступен метод getline . Вам нужно будет читать и буферизовать блок за блоком, а затем отдавать его построчно через промежуточное перо удержания.

Вы можете вытащить дескриптор сокета в IO :: Handle , и используйте для этого getline () . Что-то вроде:

my $sock = IO::Socket::INET->new(
    PeerAddr => '172.0.0.1',
    PeerPort => 1337,
    Proto    => 'tcp'
) or die $!;

my $io = new IO::Handle;
$io->fdopen(fileno($sock),"r") or die $!;

while (defined( my $data = $io->getline() )) {
    chomp $data;
    # do something
}

Возможно, вам придется выполнить рукопожатие, чтобы начать прием пакетов, но это другое дело.

1
ответ дан 1 December 2019 в 07:27
поделиться

В python это довольно просто:

f = open('teste.txt', 'r')
for line in f: # read all lines already in the file
    print line.strip()

# keep waiting forever for more lines.
while True:
    line = f.readline() # just read more
    if line: # if you got something...
        print 'got data:', line.strip()
    time.sleep(1) # wait a second to not fry the CPU needlessy
0
ответ дан 1 December 2019 в 07:27
поделиться

Возможно, вам поможет именованный канал ?

2
ответ дан 1 December 2019 в 07:27
поделиться

Решения читать весь штраф до конца - неразумно с точки зрения производительности. Если это произойдет под Linux, я бы предложил просто переименовать файл журнала. Затем вы можете сканировать все объекты в переименованном файле, а те, что в исходном файле, будут снова заполнены. Просканировав весь переименованный файл - удалите его. Или двигайтесь, куда хотите. Таким образом вы получите что-то вроде logrotate, но для сканирования только что поступающих данных.

0
ответ дан 1 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: