2012-03-28 2 views

ответ

6

Это открывает файл, читает последний байт и закрывает файл.

(defun read-final-byte (filename) 
    (with-open-file (s filename 
        :direction :input 
        :if-does-not-exist :error) 
    (let ((len (file-length s))) 
     (file-position s (1- len)) ; 0-based position. 
     (read-char s nil))))  ; don't error if reading the end of the file. 

Если вы хотите конкретно прочесть последние n линий, вам придется прочитать обратно неопределенное количество байт, пока вы не получите n+1 новой строки. Чтобы сделать это, вам нужно либо выполнить чтение блоков назад (быстрее, но закручиваться при чтении ненужных байтов), либо читать байты (медленнее, но допускает точность и немного более очевидный алгоритм).

Я подозреваю, что у tail есть разумный алгоритм для этого, так что, вероятно, стоит прочитать tailsource для руководства.

Смежные вопросы