This commit is contained in:
sxyazi 2023-10-27 14:18:36 +08:00
parent db87b50cc0
commit 9f47346e6c
No known key found for this signature in database

View file

@ -1,4 +1,4 @@
use std::{borrow::Cow, env, path::{Component, Path, PathBuf}}; use std::{borrow::Cow, env, ffi::OsString, path::{Component, Path, PathBuf}};
use tokio::fs; use tokio::fs;
@ -44,23 +44,31 @@ pub fn expand_url(mut u: Url) -> Url {
} }
pub async fn unique_path(mut p: Url) -> Url { pub async fn unique_path(mut p: Url) -> Url {
let Some(name) = p.file_stem().map(|n| n.to_owned()) else { let Some(stem) = p.file_stem().map(|s| s.to_owned()) else {
return p; return p;
}; };
let ext = p
.extension()
.map(|s| {
let mut n = OsString::with_capacity(s.len() + 1);
n.push(".");
n.push(s);
n
})
.unwrap_or_default();
let mut i = 0; let mut i = 0;
while fs::symlink_metadata(&p).await.is_ok() { while fs::symlink_metadata(&p).await.is_ok() {
i += 1; i += 1;
let mut name = name.clone();
let mut name = OsString::with_capacity(stem.len() + ext.len() + 5);
name.push(&stem);
name.push(format!("_{i}")); name.push(format!("_{i}"));
let extension = p.extension().map(|n| n.to_owned()); if !ext.is_empty() {
match extension { name.push(&ext);
Some(extension) => {
name.push(format!("."));
name.push(extension);
}
None => {}
} }
p.set_file_name(name); p.set_file_name(name);
} }
p p