Путь :: read_dir и Windows - PullRequest
       0

Путь :: read_dir и Windows

0 голосов
/ 07 мая 2020

Это простое тестовое приложение для отображения содержимого каталога:

fn main() {
    let mut p = PathBuf::from(r"c:");
    println!("drive 1: {}", p.to_str().unwrap());
    p.push(std::path::MAIN_SEPARATOR.to_string());
    println!("drive 2: {}", p.to_str().unwrap());
    p.push(r"*.*");
    println!("drive 3: {}", p.to_str().unwrap());

    println!("root: {}", p.to_str().unwrap());
    match fs::read_dir(p) {
        Ok(x) => {
            for path in x {
                println!("path: {:?}", path);
            }
        }
        Err(why) => {
            println!("Error: {}", why);
        }
    };
}

Результат:

drive 1: c:  
drive 2: c:\  
drive 3: c:\\*.*  
walk_dir: root: c:\\*.*  
Error: The filename, directory name, or volume label syntax is incorrect. (os error 123)  

println! должны следить за прогрессом мой путь. Пожалуйста, простите имена переменных, так как я перенес оператор match из функции, чтобы его было легче читать.

Когда я вырезал и вставил последний путь, c:\*.*, в командную строку с помощью dir, все работает как положено.

Я знаю, что дело не в содержимом строки, а в том, что я делаю.

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Это было неправильное понимание входных параметров в read_dir.

Я предполагал, что read_dir хотел строку, которая была бы похожа на командную строку Windows dir или команду UNIX / Linux ls. То есть, я дал ему c:\\*.*, ожидая, что все файлы в каталоге c: drive root.

Вместо этого read_dir хочет только каталог root без спецификации файла. Сортировка / фильтрация произойдет позже.

Ввод, который сработал, был просто C:\\.

1 голос
/ 07 мая 2020

c:\*.* - это не путь, это шаблон глобуса. Как вы сами выяснили, read_dir ожидает путь, поэтому в вашем случае он ожидает c:\. Если вам действительно нужен шаблон глобуса (например, c:\*.txt), вам нужно будет отфильтровать вывод read_dir самостоятельно, или вы можете использовать ящик glob.

0 голосов
/ 07 мая 2020

Попробуйте заменить PathBuf::from(r"c:") на PathBuf::from(r"c:\") и / или p.push(r"*.*"); на p.push(r"\*.*");?

https://doc.rust-lang.org/std/path/struct.PathBuf.html#method .pu sh:

На Windows:

  • если path имеет root, но без префикса (например, \windows), он заменяет все, кроме префикса (если есть) self.
  • если path имеет префикс, но не root, он заменяет self.

https://doc.rust-lang.org/std/path/enum.Prefix.html:

Windows префиксы пути, например, C: или \ server \ share.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...