CCR
1
详述
如题,目前遇到的困难是 Linux 允许使用英文双引号作为文件名,而我写的软件希望能正确识别此类标题,同时还要兼容windows的双引号问题(我还不想用正则解决该问题)
代码:
此段代码主要用于解决\
符号导致的转义、手误多打的双引号问题
fn rm_special(name: &str) -> String {
let mut temp = name.replace(r#"\"#, r#"/"#).replace(r#"//"#, r#"/"#);
while temp.ends_with(r#"""#) {
temp = temp[0..temp.len() - 2].to_string();
}
while name.ends_with(r#"\"#) {
temp = temp[0..temp.len() - 2].to_string();
}
while name.starts_with(r#"""#) {
temp = temp[1..temp.len() - 1].to_string();
}
temp
}
举例:
Windows:
"C:\\Program Files\\"
在windows下将被正确识别为C:/Program Files
目录
"C:\Program Files\"
在windows下将被正确识别为C:/Program Files
目录 (软件实际接收到的是C:\Program Files"
,需要自行处理被转义的双引号)
Linux:
有一个在 a b
目录下的 "
文件,传参为 "a b\""
→ 无法识别,因为\"
被当成了转义符…… 问题是我无法避免用户进行此种输入,也难以检测这种输入是否合法……
What can i do
hut
4
Linux 下路径分隔符难道不是斜线(/)吗?反斜线(\)它就是转义符。如果用户搞错了路径分隔符,那是用户的事。
另外你这个代码处理路径手撸肯定不对,应该使用标准库的Path模块(我觉得rust肯定有这样的模块),一般来说,这种模块都会处理平台差异(如路径分隔符),文件名里的特殊字符等。
CCR
5
问题是我经常自己输错,所以至少得兼容自己(
有,但都是最基础的,所以我才来问问有啥办法没,我再搜搜,我认为也得有像python的pathlib那样的东西的……
hut
6
我还是觉得你思路不对,保证输入正确是用户的事,不是程序该干的事。比如:有时候我输入 \"
, 有时候我输入 "
,你怎么知道我是故意这样输入还是不小心输入错了?没有办法判断。
1 个赞
hut
7
fn rm_special(name: &str) -> String {
let mut temp = name.replace(r#"\"#, r#"/"#).replace(r#"//"#, r#"/"#);
while temp.ends_with(r#"""#) {
temp = temp[0..temp.len() - 1].to_string(); // 2 -> 1
}
while temp.ends_with(r#"\"#) { // name -> temp
temp = temp[0..temp.len() - 1].to_string(); // 2 -> 1
}
while temp.starts_with(r#"""#) { // name -> temp
temp = temp[1..temp.len() - 1].to_string();
}
temp
}
你统一使用 / 作为分隔符就行了。
Windows 的 API 都接受 / 作为分隔符。
至于 Linux 的话,文件名只禁止 /,其它字符都能用。我自己写过 Linux 的文件系统还是比较清楚的。
2 个赞