这段代码应该如何改进才能正确识别如 `"` 这种超级奇怪的文件名呢?

详述

如题,目前遇到的困难是 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

对了,软件的完整代码见

要是用正则也行(

解决问题第一

Linux 下路径分隔符难道不是斜线(/)吗?反斜线(\)它就是转义符。如果用户搞错了路径分隔符,那是用户的事。

另外你这个代码处理路径手撸肯定不对,应该使用标准库的Path模块(我觉得rust肯定有这样的模块),一般来说,这种模块都会处理平台差异(如路径分隔符),文件名里的特殊字符等。

问题是我经常自己输错,所以至少得兼容自己(

有,但都是最基础的,所以我才来问问有啥办法没,我再搜搜,我认为也得有像python的pathlib那样的东西的……

我还是觉得你思路不对,保证输入正确是用户的事,不是程序该干的事。比如:有时候我输入 \", 有时候我输入 ",你怎么知道我是故意这样输入还是不小心输入错了?没有办法判断。

1 个赞
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 个赞