Почему мой канонизированный путь имеет префикс \\?\

Я работаю над личным проектом, который пытался решить с помощью канонизации относительного пути в Rust. Однако всякий раз, когда я это делаю, новый путь имеет префикс со странной последовательностью \\?\. Например, что-то такое простое, как:

let p = fs::canonicalize(".").unwrap();
println!("{}", p.display());

приведет к чему-то вроде следующего вывода:

\\?\C:\Users\[...]\rustprojects\projectname

Это не особая проблема, потому что я могу выполнить то, что пытаюсь, другими способами. Однако это кажется странным поведением, особенно если вы собираетесь использовать строковую форму пути каким-то образом, требующим точности. Почему эта последовательность символов предшествует результату и как этого избежать?


person MutantOctopus    schedule 20.12.2016    source источник


Ответы (1)


Префикс \\?\ указывает Windows обрабатывать путь как есть, т. е. отключает специальное значение . и .., специальные имена устройств, такие как CON, не интерпретируются, а путь считается абсолютным. Он также позволяет использовать пути до 32 767 символов (кодовые единицы UTF-16), тогда как в противном случае ограничение составляет 260 (если только вы не используете Windows 10 версии 1607 или более поздней версии и ваше приложение не использует более длинные пути).

Таким образом, префикс \\?\ гарантирует, что вы получите удобный путь; удаление этого префикса может привести к тому, что путь станет непригодным для использования или приведет к другому файлу! Поэтому я бы порекомендовал вам сохранить этот префикс в ваших путях.

person Francis Gagné    schedule 20.12.2016