@@ -264,8 +264,9 @@ extension FileManager {
264
264
}
265
265
266
266
internal func _createSymbolicLink( atPath path: String , withDestinationPath destPath: String ) throws {
267
- let faAttributes : WIN32_FILE_ATTRIBUTE_DATA = try windowsFileAttributes ( atPath: path)
268
- var dwFlags : DWORD = DWORD ( SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)
267
+ var dwFlags = DWORD ( SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)
268
+ // destPath may not exist in which case we default to creating a file symlink
269
+ let faAttributes = ( try ? windowsFileAttributes ( atPath: destPath) ) ?? WIN32_FILE_ATTRIBUTE_DATA ( )
269
270
if faAttributes. dwFileAttributes & DWORD ( FILE_ATTRIBUTE_DIRECTORY) == DWORD ( FILE_ATTRIBUTE_DIRECTORY) {
270
271
dwFlags |= DWORD ( SYMBOLIC_LINK_FLAG_DIRECTORY)
271
272
}
@@ -286,12 +287,12 @@ extension FileManager {
286
287
internal func _canonicalizedPath( toFileAtPath path: String ) throws -> String {
287
288
var hFile : HANDLE = INVALID_HANDLE_VALUE
288
289
path. withCString ( encodedAs: UTF16 . self) { link in
289
- hFile = CreateFileW ( link, GENERIC_READ, DWORD ( FILE_SHARE_WRITE) , nil , DWORD ( OPEN_EXISTING) , DWORD ( FILE_FLAG_BACKUP_SEMANTICS) , nil )
290
+ hFile = CreateFileW ( link, GENERIC_READ, DWORD ( FILE_SHARE_READ | FILE_SHARE_WRITE) , nil , DWORD ( OPEN_EXISTING) , DWORD ( FILE_FLAG_BACKUP_SEMANTICS) , nil )
290
291
}
291
- defer { CloseHandle ( hFile) }
292
292
if hFile == INVALID_HANDLE_VALUE {
293
293
throw _NSErrorWithWindowsError ( GetLastError ( ) , reading: true )
294
294
}
295
+ defer { CloseHandle ( hFile) }
295
296
296
297
let dwLength : DWORD = GetFinalPathNameByHandleW ( hFile, nil , 0 , DWORD ( FILE_NAME_NORMALIZED) )
297
298
var szPath : [ WCHAR ] = Array < WCHAR > ( repeating: 0 , count: Int ( dwLength + 1 ) )
0 commit comments