Skip to content

Commit 2e1041f

Browse files
authored
Fix setAttribute modificationData on Windows for directories (#1855)
- Add missing CreateFileW flag needed for directories. - Adds verification that setAttributes correctly sets and retrieves modification dates on both files and directories.
1 parent 0506e46 commit 2e1041f

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

Sources/FoundationEssentials/FileManager/FileManager+Files.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ extension _FileManagerImpl {
841841
ftTime.dwLowDateTime = uiTime.LowPart
842842
ftTime.dwHighDateTime = uiTime.HighPart
843843

844-
let hFile: HANDLE = CreateFileW($0, GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, nil)
844+
let hFile: HANDLE = CreateFileW($0, GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nil)
845845
if hFile == INVALID_HANDLE_VALUE {
846846
throw CocoaError.errorWithFilePath(path, win32: GetLastError(), reading: true)
847847
}

Tests/FoundationEssentialsTests/FileManager/FileManagerTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,27 @@ private struct FileManagerTests {
886886
}
887887
}
888888

889+
@Test func testSetAttributesModificationDate() async throws {
890+
try await FilePlayground {
891+
"testFile"
892+
Directory("testDir") {}
893+
}.test { fileManager in
894+
// Test setAttributes with modificationDate on files
895+
let fileTestDate = Date(timeIntervalSince1970: 1234567890)
896+
try fileManager.setAttributes([.modificationDate: fileTestDate], ofItemAtPath: "testFile")
897+
let fileAttrs = try fileManager.attributesOfItem(atPath: "testFile")
898+
let fileModDate = try #require(fileAttrs[.modificationDate] as? Date)
899+
#expect(abs(fileModDate.timeIntervalSince1970 - fileTestDate.timeIntervalSince1970) < 2.0, "File modification date should be set correctly")
900+
901+
// Test setAttributes with modificationDate on directories
902+
let dirTestDate = Date(timeIntervalSince1970: 1234567890)
903+
try fileManager.setAttributes([.modificationDate: dirTestDate], ofItemAtPath: "testDir")
904+
let directoryAttrs = try fileManager.attributesOfItem(atPath: "testDir")
905+
let directoryModDate = try #require(directoryAttrs[.modificationDate] as? Date)
906+
#expect(abs(directoryModDate.timeIntervalSince1970 - dirTestDate.timeIntervalSince1970) < 2.0, "Directory modification date should be set correctly")
907+
}
908+
}
909+
889910
@Test func malformedModificationDateAttribute() async throws {
890911
let sentinelDate = Date(timeIntervalSince1970: 100)
891912
try await FilePlayground {

0 commit comments

Comments
 (0)