Make sure CreateDirectoryW works for path lengths > 247

This commit is contained in:
Chris Denton
2021-10-23 19:34:09 +01:00
parent 3e2d606241
commit f1efc7efb2
3 changed files with 41 additions and 1 deletions

View File

@@ -1411,3 +1411,32 @@ fn symlink_hard_link() {
// "hard_link" should still appear as a symlink.
assert!(check!(fs::symlink_metadata(tmpdir.join("hard_link"))).file_type().is_symlink());
}
/// Ensure `fs::create_dir` works on Windows with longer paths.
#[test]
#[cfg(windows)]
fn create_dir_long_paths() {
use crate::{ffi::OsStr, iter, os::windows::ffi::OsStrExt};
const PATH_LEN: usize = 247;
let tmpdir = tmpdir();
let mut path = tmpdir.path().to_path_buf();
path.push("a");
let mut path = path.into_os_string();
let utf16_len = path.encode_wide().count();
if utf16_len >= PATH_LEN {
// Skip the test in the unlikely event the local user has a long temp directory path.
// This should not affect CI.
return;
}
// Increase the length of the path.
path.extend(iter::repeat(OsStr::new("a")).take(PATH_LEN - utf16_len));
// This should succeed.
fs::create_dir(&path).unwrap();
// This will fail if the path isn't converted to verbatim.
path.push("a");
fs::create_dir(&path).unwrap();
}