У меня есть программа, которая записывает строку в файл. Он отлично работает в macos mojave, но не в yosemite.
Использование Xcode 11 и Swift 5
Код (Log.swift)
import Foundation
open class Log {
open var maxFileSize: UInt64 = 102400
open var maxFileCount = 365
///The directory in which the log files will be written
open var directory = Log.defaultDirectory() {
didSet {
directory = NSString(string: directory).expandingTildeInPath
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: directory) {
do {
try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil)
} catch {
NSLog("Couldn't create directory at \(directory)")
}
}
}
}
open var currentPath: String {
return "\(directory)/\(logName(0))"
}
///The name of the log files
open var name = "logfile"
///Whether or not logging also prints to the console
open var printToConsole = true
///logging singleton
open class var logger: Log {
struct Static {
static let instance: Log = Log()
}
return Static.instance
}
//the date formatter
var dateFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.timeStyle = .medium
formatter.dateStyle = .medium
return formatter
}
///write content to the current log file.
open func write(_ text: String) {
let path = currentPath
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: path) {
do {
try "".write(toFile: path, atomically: true, encoding: String.Encoding.utf8)
} catch _ {
}
}
if let fileHandle = FileHandle(forWritingAtPath: path) {
let dateStr = dateFormatter.string(from: Date())
let writeText = "[\(dateStr)]: \(text)\n"
fileHandle.seekToEndOfFile()
fileHandle.write(writeText.data(using: String.Encoding.utf8)!)
fileHandle.closeFile()
}
}
///Recursive method call to rename log files
func rename(_ index: Int) {
let fileManager = FileManager.default
let path = "\(directory)/\(logName(index))"
let newPath = "\(directory)/\(logName(index+1))"
if fileManager.fileExists(atPath: newPath) {
rename(index+1)
}
do {
try fileManager.moveItem(atPath: path, toPath: newPath)
} catch _ {
}
}
///gets the log name
func logName(_ num :Int) -> String {
return "\(name)-\(num).log"
}
///get the default log directory
class func defaultDirectory() -> String {
var path = ""
let fileManager = FileManager.default
let urls = fileManager.urls(for: .libraryDirectory, in: .userDomainMask)
//let urls = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask)
if let url = urls.last {
path = "\(url.path)/TestingLog/Logs"
}
if !fileManager.fileExists(atPath: path) && path != "" {
do {
try fileManager.createDirectory(atPath: path, withIntermediateDirectories: false, attributes: nil)
} catch _ {
}
}
return path
}
}
///Writes content to the current log file
public func logw(_ text: String) {
Log.logger.write(text)
}
В другом файле swift Я использую logw ("test1") для печати test1 в файле в каталоге appsupport.
Что плохого в том, что он не пишет в yosemite?
Мне нужно, чтобы он не удалял файл или текст в файле и добавляйте его при записи журнала.