@@ -531,20 +531,38 @@ extension _FileManagerImpl {
531
531
throw CocoaError . errorWithFilePath ( path, win32: GetLastError ( ) , reading: true )
532
532
}
533
533
534
+ let hFile = CreateFileW ( pwszPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nil , OPEN_EXISTING, 0 , nil )
535
+ if hFile == INVALID_HANDLE_VALUE {
536
+ throw CocoaError . errorWithFilePath ( path, win32: GetLastError ( ) , reading: true )
537
+ }
538
+ defer { CloseHandle ( hFile) }
539
+
540
+ let dwFileType = GetFileType ( hFile)
541
+ let fatType : FileAttributeType = switch ( dwFileType) {
542
+ case FILE_TYPE_CHAR: FileAttributeType . typeCharacterSpecial
543
+ case FILE_TYPE_DISK:
544
+ faAttributes. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == FILE_ATTRIBUTE_DIRECTORY
545
+ ? FileAttributeType . typeDirectory
546
+ : FileAttributeType . typeRegular
547
+ case FILE_TYPE_PIPE: FileAttributeType . typeSocket
548
+ case FILE_TYPE_UNKNOWN: FileAttributeType . typeUnknown
549
+ default : FileAttributeType . typeUnknown
550
+ }
551
+
534
552
let size : UInt64 = ( UInt64 ( faAttributes. nFileSizeHigh) << 32 ) | UInt64 ( faAttributes. nFileSizeLow)
535
553
let creation : Date = Date ( timeIntervalSince1970: faAttributes. ftCreationTime. timeIntervalSince1970)
536
554
let modification : Date = Date ( timeIntervalSince1970: faAttributes. ftLastWriteTime. timeIntervalSince1970)
537
555
return [
538
556
. size: _writeFileAttributePrimitive ( size, as: UInt . self) ,
539
557
. modificationDate: modification,
540
558
. creationDate: creation,
559
+ . type: fatType,
541
560
542
561
// TODO(compnerd) support these attributes, remapping the Windows semantics...
543
562
// .posixPermissions: ...,
544
563
// .referenceCount: ...,
545
564
// .systemNumber: ...,
546
565
// .systemFileNumber: ...,
547
- // .type: ...,
548
566
// .ownerAccountID: ...,
549
567
// .groupownerAccountID: ...,
550
568
// .ownerAccountName: ...,
0 commit comments