parent
30a380e7ec
commit
1e1019a3de
@ -0,0 +1,82 @@
|
|||||||
|
//! Temp file
|
||||||
|
use super::*;
|
||||||
|
use std::{
|
||||||
|
ops::Drop,
|
||||||
|
path::{
|
||||||
|
Path,
|
||||||
|
PathBuf,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref DEFAULT_LOCATION: PathBuf = std::env::temp_dir();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn genname() -> String
|
||||||
|
{
|
||||||
|
uuid::Uuid::new_v4().to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TempFile(Option<PathBuf>);
|
||||||
|
|
||||||
|
impl TempFile
|
||||||
|
{
|
||||||
|
/// Create a new instance in default temp location
|
||||||
|
pub fn new() -> Self
|
||||||
|
{
|
||||||
|
Self::new_in(&*DEFAULT_LOCATION)
|
||||||
|
}
|
||||||
|
/// Create a new instance with random name in this location
|
||||||
|
pub fn new_in<P: AsRef<Path>>(dir: P) -> Self
|
||||||
|
{
|
||||||
|
Self::new_path(dir.as_ref().join(genname()))
|
||||||
|
}
|
||||||
|
/// Create a new instance from a specific path
|
||||||
|
pub fn new_path<P: Into<PathBuf>>(path: P) -> Self
|
||||||
|
{
|
||||||
|
let path = path.into();
|
||||||
|
trace!("Creating temp owned path {:?}", path);
|
||||||
|
Self(Some(path))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The internal path
|
||||||
|
pub fn path(&self) -> &Path
|
||||||
|
{
|
||||||
|
(&self.0).as_ref().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Release ownership of the path, not deleting the file if it exists
|
||||||
|
pub fn release(mut self) -> PathBuf
|
||||||
|
{
|
||||||
|
let d = self.0.take().unwrap();
|
||||||
|
std::mem::forget(self);
|
||||||
|
d
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Attempt to remove this temp file async
|
||||||
|
pub async fn drop_async(mut self) -> tokio::io::Result<()>
|
||||||
|
{
|
||||||
|
let res = tokio::fs::remove_file(self.0.take().unwrap()).await;
|
||||||
|
std::mem::forget(self);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AsRef<Path> for TempFile
|
||||||
|
{
|
||||||
|
#[inline] fn as_ref(&self) -> &Path
|
||||||
|
{
|
||||||
|
self.path()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for TempFile
|
||||||
|
{
|
||||||
|
fn drop(&mut self)
|
||||||
|
{
|
||||||
|
if let Err(e) = std::fs::remove_file(self.0.take().unwrap()) {
|
||||||
|
debug!("Failed to remove owned temp file (sync, drop): {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue