CommandLineToolkit
45 строк · 1.3 Кб
1#if canImport(Darwin)
2import Darwin
3#endif
4#if canImport(Glibc)
5import Glibc
6#endif
7import Foundation
8import PathLib
9
10public final class TemporaryFile {
11public let fileHandleForWriting: FileHandle
12public let absolutePath: AbsolutePath
13private let deleteOnDealloc: Bool
14
15public init(
16containerPath: AbsolutePath? = nil,
17prefix: String = "TemporaryFile",
18suffix: String = "",
19closeOnDealloc: Bool = true,
20deleteOnDealloc: Bool = true
21) throws {
22let containerPath = containerPath ?? AbsolutePath(NSTemporaryDirectory())
23let pathTemplate = containerPath.appending("\(prefix).XXXXXX\(suffix)")
24
25var templateBytes = [UInt8](pathTemplate.pathString.utf8).map { Int8($0) } + [Int8(0)]
26let fileDescriptor = mkstemps(&templateBytes, Int32(suffix.count))
27
28if fileDescriptor == -1 {
29throw ErrnoError.failedToCreateTemporaryFile(pathTemplate, code: errno)
30}
31
32self.fileHandleForWriting = FileHandle(
33fileDescriptor: fileDescriptor,
34closeOnDealloc: closeOnDealloc
35)
36self.absolutePath = AbsolutePath(String(cString: templateBytes))
37self.deleteOnDealloc = deleteOnDealloc
38}
39
40deinit {
41if deleteOnDealloc {
42unlink(absolutePath.pathString)
43}
44}
45}
46