-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
File::create
fails on hidden files on Windows
#115745
Comments
Manually truncating would require also clearing the alternate data streams too, right? And it would presumably stop erroring if another process still has the file open and instead corrupt the file fron the view of the other process. |
No? The proposed solution would work the same was as |
Right, got confused with |
Windows: Allow `File::create` to work on hidden files This makes `OpenOptions::new().write(true).create(true).truncate(true).open(&path)` work if the path exists and is a hidden file. Previously it would fail with access denied. This makes it consistent with `OpenOptions::new().write(true).truncate(true).open(&path)` (note the lack of `create`) which does not have this restriction. It's also more consistent with other platforms. Fixes rust-lang#115745 (see that issue for more details).
Windows: Allow `File::create` to work on hidden files This makes `OpenOptions::new().write(true).create(true).truncate(true).open(&path)` work if the path exists and is a hidden file. Previously it would fail with access denied. This makes it consistent with `OpenOptions::new().write(true).truncate(true).open(&path)` (note the lack of `create`) which does not have this restriction. It's also more consistent with other platforms. Fixes rust-lang#115745 (see that issue for more details).
Windows: Allow `File::create` to work on hidden files This makes `OpenOptions::new().write(true).create(true).truncate(true).open(&path)` work if the path exists and is a hidden file. Previously it would fail with access denied. This makes it consistent with `OpenOptions::new().write(true).truncate(true).open(&path)` (note the lack of `create`) which does not have this restriction. It's also more consistent with other platforms. Fixes rust-lang#115745 (see that issue for more details).
Windows: Allow `File::create` to work on hidden files This makes `OpenOptions::new().write(true).create(true).truncate(true).open(&path)` work if the path exists and is a hidden file. Previously it would fail with access denied. This makes it consistent with `OpenOptions::new().write(true).truncate(true).open(&path)` (note the lack of `create`) which does not have this restriction. It's also more consistent with other platforms. Fixes rust-lang#115745 (see that issue for more details).
Reported on discord, using
OpenOptions::new().write(true).create(true).truncate(true).open(&path)
will fail on Windows if the file is hidden. This also affects methods likeFile::create
orfs::write
that open the file the same way.The reason for this is that we use
CREATE_ALWAYS
, which has strange behaviour:So to make it work the caller needs to match the requested attributes to the existing attributes at the time of opening.
Possible solution
It was suggested we could instead use
OPEN_ALWAYS
and then manually truncate the file usingSetFileInformationByHandle
to set theFILE_ALLOCATION_INFO
to zero.The text was updated successfully, but these errors were encountered: