Commit 1ae378e7a2
Changed files (1)
lib
std
lib/std/os/windows.zig
@@ -940,8 +940,13 @@ pub fn DeleteFile(sub_path_w: []const u16, options: DeleteFileOptions) DeleteFil
}
defer CloseHandle(tmp_handle);
+ // FileDispositionInformationEx (and therefore FILE_DISPOSITION_POSIX_SEMANTICS and FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE)
+ // are only supported on NTFS filesystems, so the version check on its own is only a partial solution. To support non-NTFS filesystems
+ // like FAT32, we need to fallback to FileDispositionInformation if the usage of FileDispositionInformationEx gives
+ // us INVALID_PARAMETER.
+ var need_fallback = true;
if (comptime builtin.target.os.version_range.windows.min.isAtLeast(.win10_rs1)) {
- // Deletion with posix semantics.
+ // Deletion with posix semantics if the filesystem supports it.
var info = FILE_DISPOSITION_INFORMATION_EX{
.Flags = FILE_DISPOSITION_DELETE |
FILE_DISPOSITION_POSIX_SEMANTICS |
@@ -955,7 +960,14 @@ pub fn DeleteFile(sub_path_w: []const u16, options: DeleteFileOptions) DeleteFil
@sizeOf(FILE_DISPOSITION_INFORMATION_EX),
.FileDispositionInformationEx,
);
- } else {
+ switch (rc) {
+ // INVALID_PARAMETER here means that the filesystem does not support FileDispositionInformationEx
+ .INVALID_PARAMETER => {},
+ // For all other statuses, fall down to the switch below to handle them.
+ else => need_fallback = false,
+ }
+ }
+ if (need_fallback) {
// Deletion with file pending semantics, which requires waiting or moving
// files to get them removed (from here).
var file_dispo = FILE_DISPOSITION_INFORMATION{