feat: v0.1.4
This commit is contained in:
54
src/main.rs
54
src/main.rs
@@ -1,7 +1,7 @@
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{BufWriter, Read, Write};
|
use std::io::{BufWriter, Read, Write};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use clap::{App, AppSettings, Arg};
|
use clap::{App, AppSettings, Arg};
|
||||||
use rust_util::{iff, information, util_size};
|
use rust_util::{iff, information, util_size};
|
||||||
@@ -50,41 +50,55 @@ fn main() {
|
|||||||
let mut out_file = BufWriter::new(File::create(&file_name)
|
let mut out_file = BufWriter::new(File::create(&file_name)
|
||||||
.expect(&format!("Create file failed: {}", file_name)));
|
.expect(&format!("Create file failed: {}", file_name)));
|
||||||
|
|
||||||
|
let mut last_write_time = SystemTime::now();
|
||||||
let mut write_buffer = Vec::with_capacity(1024 * 8);
|
let mut write_buffer = Vec::with_capacity(1024 * 8);
|
||||||
loop {
|
loop {
|
||||||
match receiver.recv_timeout(Duration::from_secs(1)) {
|
match receiver.recv_timeout(Duration::from_secs(1)) {
|
||||||
Err(_e) => {
|
Err(_e) => {
|
||||||
if write_buffer.len() > 0 {
|
let should_flush_to_file = match SystemTime::now().duration_since(last_write_time) {
|
||||||
|
Ok(d) => d.as_millis() >= 1000,
|
||||||
|
Err(_) => false,
|
||||||
|
};
|
||||||
|
if should_flush_to_file && !write_buffer.is_empty() {
|
||||||
written_len += write_buffer.len();
|
written_len += write_buffer.len();
|
||||||
out_file.write(&write_buffer).ok();
|
out_file.write(&write_buffer).ok();
|
||||||
write_buffer.clear();
|
write_buffer.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(buff) => {
|
Ok(buff) => {
|
||||||
if buff.len() == 0 {
|
if buff.is_empty() {
|
||||||
out_file.write(&write_buffer).ok();
|
out_file.write(&write_buffer).ok();
|
||||||
out_file.flush().ok();
|
out_file.flush().ok();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
write_buffer.extend_from_slice(&buff);
|
write_buffer.extend_from_slice(&buff);
|
||||||
if write_buffer.len() > 1024 {
|
let contains_new_line = write_buffer.iter().any(|c| *c == b'\n');
|
||||||
let mut pos_of_n = -1_isize;
|
if write_buffer.len() > 4 * 1024 || contains_new_line {
|
||||||
|
let mut pos_of_n: Option<usize> = None;
|
||||||
write_buffer.iter().enumerate().for_each(|(i, c)| {
|
write_buffer.iter().enumerate().for_each(|(i, c)| {
|
||||||
if *c == b'\n' { pos_of_n = i as isize; }
|
if *c == b'\n' { pos_of_n = Some(i); }
|
||||||
});
|
});
|
||||||
if pos_of_n > -1 {
|
match pos_of_n {
|
||||||
let left_buffer = write_buffer.split_off(pos_of_n as usize + 1);
|
None => {
|
||||||
written_len += write_buffer.len();
|
written_len += write_buffer.len();
|
||||||
out_file.write(&write_buffer).ok();
|
out_file.write(&write_buffer).ok();
|
||||||
write_buffer = left_buffer;
|
write_buffer.clear();
|
||||||
out_file.flush().ok();
|
|
||||||
|
|
||||||
if written_len >= file_size {
|
|
||||||
written_len = 0;
|
|
||||||
let file_name = make_new_file_name(&prefix, &suffix, file_count, &mut file_index);
|
|
||||||
out_file = BufWriter::new(File::create(&file_name)
|
|
||||||
.expect(&format!("Create file failed: {}", file_name)));
|
|
||||||
}
|
}
|
||||||
|
Some(pos_of_n) => {
|
||||||
|
let left_buffer = write_buffer.split_off(pos_of_n + 1);
|
||||||
|
written_len += write_buffer.len();
|
||||||
|
out_file.write(&write_buffer).ok();
|
||||||
|
write_buffer = left_buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out_file.flush().ok();
|
||||||
|
last_write_time = SystemTime::now();
|
||||||
|
|
||||||
|
if written_len >= file_size {
|
||||||
|
written_len = 0;
|
||||||
|
let file_name = make_new_file_name(&prefix, &suffix, file_count, &mut file_index);
|
||||||
|
out_file = BufWriter::new(File::create(&file_name)
|
||||||
|
.expect(&format!("Create file failed: {}", file_name)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,9 +115,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
Ok(len) => {
|
Ok(len) => {
|
||||||
let mut vec = Vec::with_capacity(len);
|
let mut vec = Vec::with_capacity(len);
|
||||||
for b in &buff[0..len] {
|
vec.extend_from_slice(&buff[0..len]);
|
||||||
vec.push(*b);
|
|
||||||
}
|
|
||||||
if let Err(e) = sender.send(vec) {
|
if let Err(e) = sender.send(vec) {
|
||||||
eprintln!("[ERROR] Send error: {}", e);
|
eprintln!("[ERROR] Send error: {}", e);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user