79 lines
2.1 KiB
Swift
79 lines
2.1 KiB
Swift
//
|
|
// File.swift
|
|
//
|
|
//
|
|
// Created by iMac on 01.12.21.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
|
|
protocol DiskWriter: AnyObject {
|
|
|
|
var storageFile: FileHandle { get set }
|
|
|
|
var storageFileUrl: URL { get }
|
|
}
|
|
|
|
extension DiskWriter {
|
|
|
|
func replaceFile(data: String) throws {
|
|
let data = data.data(using: .utf8)!
|
|
try storageFile.close()
|
|
try data.write(to: storageFileUrl)
|
|
storageFile = try FileHandle(forUpdating: storageFileUrl)
|
|
if #available(macOS 10.15.4, *) {
|
|
try storageFile.seekToEnd()
|
|
} else {
|
|
storageFile.seekToEndOfFile()
|
|
}
|
|
}
|
|
|
|
static func prepareFile(at url: URL) throws -> FileHandle {
|
|
if !FileManager.default.fileExists(atPath: url.path) {
|
|
try Data().write(to: url)
|
|
}
|
|
return try FileHandle(forUpdating: url)
|
|
}
|
|
|
|
func writeToDisk(line: String) -> Bool {
|
|
let data = (line + "\n").data(using: .utf8)!
|
|
do {
|
|
if #available(macOS 10.15.4, *) {
|
|
try storageFile.write(contentsOf: data)
|
|
} else {
|
|
storageFile.write(data)
|
|
}
|
|
try storageFile.synchronize()
|
|
return true
|
|
} catch {
|
|
print("Failed to save data to file: \(storageFileUrl.path): \(error)")
|
|
return false
|
|
}
|
|
}
|
|
|
|
func readDataFromDisk() throws -> Data {
|
|
if #available(macOS 10.15.4, *) {
|
|
guard let data = try storageFile.readToEnd() else {
|
|
try storageFile.seekToEnd()
|
|
return Data()
|
|
}
|
|
return data
|
|
} else {
|
|
return storageFile.readDataToEndOfFile()
|
|
}
|
|
}
|
|
|
|
func readLinesFromDisk() throws -> [String] {
|
|
let data = try readDataFromDisk()
|
|
return parseLines(data: data)
|
|
}
|
|
|
|
private func parseLines(data: Data) -> [String] {
|
|
String(data: data, encoding: .utf8)!
|
|
.components(separatedBy: "\n")
|
|
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
|
.filter { $0 != "" }
|
|
}
|
|
}
|