Skip to content

Commit d1e05c6

Browse files
authored
Merge pull request #2441 from gmittert/FileHandleIsHandled
Handle Windows Errors in FileHandle Tests
2 parents 2a4653b + 1e4bcd0 commit d1e05c6

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

Foundation/FileHandle.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,24 @@ extension FileHandle {
852852
if error == 0 {
853853
userInfo[NSFileHandleNotificationDataItem] = Data(data)
854854
} else {
855+
#if os(Windows)
856+
// On Windows, reading from a directory results in an
857+
// ERROR_ACCESS_DENIED. If we get ERROR_ACCESS_DENIED
858+
// and the handle we attempt to read from is a
859+
// directory, replace it with
860+
// ERROR_DIRECTORY_NOT_SUPPORTED to match POSIX's EISDIR
861+
var translatedError = error
862+
if error == ERROR_ACCESS_DENIED {
863+
var fileInfo = BY_HANDLE_FILE_INFORMATION()
864+
GetFileInformationByHandle(self.handle, &fileInfo)
865+
if fileInfo.dwFileAttributes & DWORD(FILE_ATTRIBUTE_DIRECTORY) == DWORD(FILE_ATTRIBUTE_DIRECTORY) {
866+
translatedError = ERROR_DIRECTORY_NOT_SUPPORTED
867+
}
868+
}
869+
userInfo["NSFileHandleError"] = Int(translatedError)
870+
#else
855871
userInfo["NSFileHandleError"] = Int(error)
872+
#endif
856873
}
857874

858875
DispatchQueue.main.async {

TestFoundation/TestFileHandle.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,11 @@ class TestFileHandle : XCTestCase {
145145
return fh
146146
}
147147

148+
#if os(Windows)
149+
let readError = NSError(domain: NSCocoaErrorDomain, code: NSFileReadUnknownError, userInfo: [ NSUnderlyingErrorKey: NSError(domain: "org.swift.Foundation.WindowsError", code: 1, userInfo: [:])])
150+
#else
148151
let readError = NSError(domain: NSCocoaErrorDomain, code: NSFileReadUnknownError, userInfo: [ NSUnderlyingErrorKey: NSError(domain: NSPOSIXErrorDomain, code: Int(EISDIR), userInfo: [:])])
152+
#endif
149153

150154
override func tearDown() {
151155
for handle in allHandles {
@@ -463,7 +467,11 @@ class TestFileHandle : XCTestCase {
463467
}
464468

465469
XCTAssertNil(notification.userInfo?[NSFileHandleNotificationDataItem])
470+
#if os(Windows)
471+
XCTAssertEqual(error, NSNumber(value: ERROR_DIRECTORY_NOT_SUPPORTED))
472+
#else
466473
XCTAssertEqual(error, NSNumber(value: EISDIR))
474+
#endif
467475
return true
468476
}
469477

0 commit comments

Comments
 (0)