use std::{
path::Path,
time::{ Duration,SystemTime,UNIX_EPOCH }
};
fn make_path<P:AsRef<Path>,N1:AsRef<str>,N2:AsRef<str>>(dir:P,prefix:N1,suffix:N2) -> std::path::PathBuf {
loop {
let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_micros();
let p = dir.as_ref().join(format!("{}{}{}",prefix.as_ref(),now,suffix.as_ref()));
if !p.exists() { return p; }
std::thread::sleep(Duration::from_micros(1));
};
}
pub struct TempDir {
path:String
}
impl TempDir {
pub fn open() -> Result<Self,String> {
let tmpdir = std::env::temp_dir();
let path = make_path(tmpdir,"temp-","");
match std::fs::create_dir(&path) {
Ok(()) => {
Ok(Self { path:path.as_os_str().to_str().unwrap().to_string() })
},
Err(err) => { Err(format!("{}",err)) }
}
}
pub fn open_with<P:AsRef<Path>,N:AsRef<str>>(dir:P,prefix:N) -> Result<Self,String> {
let path = make_path(dir,prefix,"");
match std::fs::create_dir(&path) {
Ok(()) => {
Ok(Self { path:path.as_os_str().to_str().unwrap().to_string() })
},
Err(err) => { Err(format!("{}",err)) }
}
}
pub fn path(&self) -> &str {
self.path.as_str()
}
}
impl Drop for TempDir {
fn drop(&mut self) {
let p = Path::new(&self.path);
if p.exists() {
std::fs::remove_dir_all(p).unwrap();
}
}
}
pub struct TempFile {
path:String
}
impl TempFile {
pub fn open() -> Result<Self,String> {
let tmpdir = std::env::temp_dir();
let path = make_path(tmpdir,"","");
{
let _f = match std::fs::OpenOptions::new().create_new(true).write(true).open(&path) {
Ok(v) => { v },
Err(err) => { return Err(format!("{}",err)); },
};
}
Ok(Self { path:path.as_os_str().to_str().unwrap().to_string() })
}
pub fn open_with<P:AsRef<Path>,N1:AsRef<str>,N2:AsRef<str>>(dir:P,prefix:N1,suffix:N2) -> Result<Self,String> {
let path = make_path(dir,prefix,suffix);
{
let _f = match std::fs::OpenOptions::new().create_new(true).write(true).open(&path) {
Ok(v) => { v },
Err(err) => { return Err(format!("{}",err)); },
};
}
Ok(Self { path:path.as_os_str().to_str().unwrap().to_string() })
}
pub fn path(&self) -> &str {
self.path.as_str()
}
}
impl Drop for TempFile {
fn drop(&mut self) {
let p = Path::new(&self.path);
if p.exists() {
std::fs::remove_file(&self.path).unwrap();
}
}
}