File tree Expand file tree Collapse file tree 2 files changed +33
-12
lines changed Expand file tree Collapse file tree 2 files changed +33
-12
lines changed Original file line number Diff line number Diff line change @@ -342,6 +342,14 @@ open class FileHandle : NSObject, NSSecureCoding {
342
342
}
343
343
#endif
344
344
}
345
+
346
+ internal func _readBytes( into buffer: UnsafeMutablePointer < UInt8 > , length: Int ) throws -> Int {
347
+ let amtRead = _read ( _fd, buffer, length)
348
+ if amtRead < 0 {
349
+ throw _NSErrorWithErrno ( errno, reading: true )
350
+ }
351
+ return amtRead
352
+ }
345
353
346
354
internal func _writeBytes( buf: UnsafeRawPointer , length: Int ) throws {
347
355
#if os(Windows)
@@ -425,6 +433,15 @@ open class FileHandle : NSObject, NSSecureCoding {
425
433
}
426
434
}
427
435
#endif
436
+
437
+ internal init ? ( fileSystemRepresentation: UnsafePointer < Int8 > , flags: Int32 , createMode: Int ) {
438
+ _fd = _CFOpenFileWithMode ( fileSystemRepresentation, flags, mode_t ( createMode) )
439
+ _closeOnDealloc = true
440
+ super. init ( )
441
+ if _fd < 0 {
442
+ return nil
443
+ }
444
+ }
428
445
429
446
deinit {
430
447
// .close() tries to wait after operations in flight on the handle queue, if one exists, and then close. It does so by sending .sync { … } work to it.
Original file line number Diff line number Diff line change @@ -1720,25 +1720,29 @@ open class FileManager : NSObject {
1720
1720
#if os(Windows)
1721
1721
NSUnimplemented ( )
1722
1722
#else
1723
- guard let file1 = FileHandle ( forReadingAtPath: String ( cString: file1Rep) ) else {
1724
- return false
1725
- }
1726
-
1727
- defer { try ? file1. close ( ) }
1723
+ guard let file1 = FileHandle ( fileSystemRepresentation: file1Rep, flags: O_RDONLY, createMode: 0 ) else { return false }
1724
+ guard let file2 = FileHandle ( fileSystemRepresentation: file2Rep, flags: O_RDONLY, createMode: 0 ) else { return false }
1728
1725
1729
- guard let file2 = FileHandle ( forReadingAtPath: String ( cString: file2Rep) ) else {
1730
- return false
1726
+ var buffer1 = UnsafeMutablePointer< UInt8> . allocate( capacity: bufSize)
1727
+ var buffer2 = UnsafeMutablePointer< UInt8> . allocate( capacity: bufSize)
1728
+ defer {
1729
+ buffer1. deallocate ( )
1730
+ buffer2. deallocate ( )
1731
1731
}
1732
1732
1733
- defer { try ? file2. close ( ) }
1734
-
1735
1733
var bytesLeft = size
1736
1734
while bytesLeft > 0 {
1737
1735
let bytesToRead = Int ( min ( Int64 ( bufSize) , bytesLeft) )
1738
- let file1Data = file1. readData ( ofLength: bytesToRead)
1739
- let file2Data = file2. readData ( ofLength: bytesToRead)
1740
1736
1741
- guard file1Data. count == bytesToRead, file2Data. count == bytesToRead, file1Data == file2Data else {
1737
+ guard let file1BytesRead = try ? file1. _readBytes ( into: buffer1, length: bytesToRead) , file1BytesRead == bytesToRead else {
1738
+ return false
1739
+ }
1740
+
1741
+ guard let file2BytesRead = try ? file2. _readBytes ( into: buffer2, length: bytesToRead) , file2BytesRead == bytesToRead else {
1742
+ return false
1743
+ }
1744
+
1745
+ guard memcmp ( buffer1, buffer2, bytesToRead) == 0 else {
1742
1746
return false
1743
1747
}
1744
1748
You can’t perform that action at this time.
0 commit comments