{"record":{"id":"0c730a9ab903f14e","repo":"rust-lang/rust","slug":"creating-or-truncating-a-file-requires-write-or-ap-0c730a","errorCode":null,"errorMessage":"creating or truncating a file requires write or append access","messagePattern":"creating or truncating a file requires write or append access","errorType":"validation","errorClass":"io::Error","httpStatus":null,"severity":"error","filePath":"library/std/src/sys/fs/windows.rs","lineNumber":275,"sourceCode":"    pub fn freeze_last_write_time(&mut self, freeze: bool) {\n        self.freeze_last_write_time = freeze;\n    }\n\n    fn get_access_mode(&self) -> io::Result<u32> {\n        match (self.read, self.write, self.append, self.access_mode) {\n            (.., Some(mode)) => Ok(mode),\n            (true, false, false, None) => Ok(c::GENERIC_READ),\n            (false, true, false, None) => Ok(c::GENERIC_WRITE),\n            (true, true, false, None) => Ok(c::GENERIC_READ | c::GENERIC_WRITE),\n            (false, _, true, None) => Ok(c::FILE_GENERIC_WRITE & !c::FILE_WRITE_DATA),\n            (true, _, true, None) => {\n                Ok(c::GENERIC_READ | (c::FILE_GENERIC_WRITE & !c::FILE_WRITE_DATA))\n            }\n            (false, false, false, None) => {\n                // If no access mode is set, check if any creation flags are set\n                // to provide a more descriptive error message\n                if self.create || self.create_new || self.truncate {\n                    Err(io::Error::new(\n                        io::ErrorKind::InvalidInput,\n                        \"creating or truncating a file requires write or append access\",\n                    ))\n                } else {\n                    Err(io::Error::new(\n                        io::ErrorKind::InvalidInput,\n                        \"must specify at least one of read, write, or append access\",\n                    ))\n                }\n            }\n        }\n    }\n\n    fn get_cmode_disposition(&self) -> io::Result<(u32, u32)> {\n        match (self.write, self.append) {\n            (true, false) => {}\n            (false, false) => {\n                if self.truncate || self.create || self.create_new {","sourceCodeStart":257,"sourceCodeEnd":293,"githubUrl":"https://github.com/rust-lang/rust/blob/7088e4b63a9516ebfbfe2ab2d999cf01a528ac14/library/std/src/sys/fs/windows.rs#L257-L293","documentation":"Windows counterpart of error 213. In get_access_mode() (windows.rs:271-278), when read/write/append/access_mode are all unset but create/create_new/truncate IS set, the open is rejected with InvalidInput because creating or truncating requires write or append access.","triggerScenarios":"`OpenOptions::new().create(true).open(p)` on Windows with no .read/.write/.append.","commonSituations":"Assuming .create(true) implies write; same builder mistake as on Unix but surfaced by the Windows backend.","solutions":["Add .write(true) or .append(true) to the builder.","For exclusive create-if-absent, use .write(true).create_new(true)."],"exampleFix":"// before\nstd::fs::OpenOptions::new().create(true).open(\"f\")?;\n// after\nstd::fs::OpenOptions::new().write(true).create(true).open(\"f\")?","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":"match std::fs::OpenOptions::new().create(true).open(p) {\n    Ok(f) => f,\n    Err(e) if e.kind() == std::io::ErrorKind::InvalidInput => {\n        return Err(e); // add .write(true)\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Whenever you set .create/.create_new/.truncate, also set .write(true) or .append(true).","Prefer File::create(p) for the common create-for-write case."],"tags":["rust","std","fs","windows","openoptions","platform"],"backgroundTag":null,"analyzedSha":"7088e4b63a9516ebfbfe2ab2d999cf01a528ac14","analyzedAt":"2026-08-10T14:17:03.603Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}