大家好,欢迎来到IT知识分享网。
代码:
use std::{ fs::File, io::{self, BufRead, BufReader, Seek, SeekFrom}, thread::sleep, time::Duration, }; fn tail(file_path: &str, lines: usize) -> io::Result<()> { // 先打开文件,用 BufReader 读取全部行 let file_for_read = File::open(file_path)?; let reader = BufReader::new(file_for_read); let all_lines: Vec<String> = reader.lines().collect::<Result<_, _>>()?; // 打印最后 lines 行 let start = if all_lines.len() > lines { all_lines.len() - lines } else { 0 }; for line in &all_lines[start..] { println!("{}", line); } // 再打开一次文件用于监听尾部新增内容 let mut file_for_follow = File::open(file_path)?; let mut pos = file_for_follow.seek(SeekFrom::End(0))?; loop { let metadata = file_for_follow.metadata()?; let file_len = metadata.len(); if file_len > pos { file_for_follow.seek(SeekFrom::Start(pos))?; let new_reader = BufReader::new(&file_for_follow); let mut lines_iter = new_reader.lines(); while let Some(line) = lines_iter.next() { println!("{}", line?); } pos = file_for_follow.seek(SeekFrom::Current(0))?; } sleep(Duration::from_secs(1)); } } fn main() -> io::Result<()> { let args: Vec<String> = std::env::args().collect(); if args.len() < 2 { eprintln!("Usage: {} <file_path> [lines]", args[0]); std::process::exit(1); } let file_path = &args[1]; let lines = if args.len() > 2 { args[2].parse::<usize>().unwrap_or(10) } else { 10 }; tail(file_path, lines) }
./target/release/tail_tool ./1.txt 5
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/185321.html