Rust中std::path::Path的is_file()始终返回false的问题排查
问题原因分析
你遇到的问题根源在于stdin().read_line()的行为——它会将用户输入时按下的**换行符(\n)或回车换行(\r\n)**一并读取到目标字符串中。这就导致你通过输入得到的path变量末尾多了一个看不见的换行字符,当你用这个带换行的字符串创建Path时,系统找不到匹配的文件/目录,所以is_file()返回false。
而直接用固定字符串创建Path时,字符串里没有多余的换行符,路径完全匹配,因此能正确识别为文件。
验证问题
你可以通过Debug格式打印输入的路径来确认这一点:
let mut path = String::new(); input("What is the path to your file/directory?", &mut path); println!("{:?}", path); // 会输出类似"../directory/file.js\n"的内容
解决方案
有几种可靠的方式处理这个问题:
方法1:使用trim_end_matches精准移除换行符
这种方法只会去掉末尾的换行相关字符,不会误删路径中合法的空格:
use std::path::Path; use std::io::{self, stdin}; pub fn input(msg: &str, v: &mut String) { println!("{}", msg); stdin().read_line(v).unwrap(); } fn main() { let mut path = String::new(); input("What is the path to your file/directory?", &mut path); // 移除末尾的\n或\r\n let trimmed_path = path.trim_end_matches(&['\n', '\r'][..]); let file = Path::new(trimmed_path); println!("{}", file.is_file()); }
方法2:修改input函数自动处理
你可以在输入函数内部直接处理换行符,这样每次调用input都不用重复处理:
use std::path::Path; use std::io::{self, stdin}; pub fn input(msg: &str, v: &mut String) { println!("{}", msg); stdin().read_line(v).unwrap(); // 移除末尾的换行字符并更新原字符串 *v = v.trim_end_matches(&['\n', '\r'][..]).to_string(); } fn main() { let mut path = String::new(); input("What is the path to your file/directory?", &mut path); let file = Path::new(&path); println!("{}", file.is_file()); }
方法3:使用trim()(谨慎使用)
trim()会移除字符串首尾的所有空白字符(包括空格、换行、制表符等),如果你的路径首尾不会有合法的空格,可以用这个简化写法:
let file = Path::new(path.trim());
内容的提问来源于stack exchange,提问作者dwib
相关产品推荐
相关产品推荐

