remove_bom/
lib.rs

1use std::fs::File;
2use std::fs;
3use std::io::Read;
4use std::io::{Seek,SeekFrom};
5use std::io;
6
7fn check_bom(file_name :&str) -> bool {
8    let mut f = File::open(file_name).unwrap();
9    let mut buf = vec![0;3];
10    f.read(&mut buf).unwrap();
11    if (buf[0] == 0xef) && (buf[1] == 0xbb) && (buf[2] == 0xbf) {
12        return true;
13    }
14    false
15}
16
17fn remove_bom_impl(file_name :&str) -> bool {
18    let tmpname = file_name.to_owned() + ".tmp";
19    {
20        fs::rename(file_name, tmpname.as_str()).unwrap();
21
22        let mut old_file = File::open(tmpname.as_str()).unwrap();
23        let mut file = File::create(file_name).unwrap();
24        old_file.seek(SeekFrom::Start(3)).unwrap();
25        io::copy(&mut old_file, &mut file).unwrap();
26    }
27    fs::remove_file(tmpname.as_str()).unwrap();
28    true
29}
30
31pub fn remove_bom(file_name: &str) ->bool {
32    match check_bom(file_name) {
33        true => remove_bom_impl(file_name),
34        false => true
35    }
36}