如何将快速更新的字符串附加到 swift 中的文件
How to append fast updating strings to file in swift
我想在方法内更新传感器时将传感器数据写入文件。我需要在数据更新时附加数据,但当我尝试这样做时,我的文件会被最后一个传感器输出覆盖。
func startAccel(fileName: String, fileURL: URL) ->Void{ //Starting accelerometer
motionManager.accelerometerUpdateInterval = 1.0 / Double(hz) //determines refresh speed
motionManager.startAccelerometerUpdates(to: OperationQueue.current!){ (data, error) in
if let myData = data{
do{
let newLine = "Accelerometer, \(myData.acceleration.x), \(myData.acceleration.y),\(myData.acceleration.z)\n"
try newLine.write(to: fileURL, atomically: false, encoding: .utf8)
try print(String(contentsOf: fileURL, encoding:.utf8))
}catch{
print("yeah that didn't work sorry bub")
}
}
}
}
每次调用 newLine.write() 时,此代码都会覆盖文件,并且该函数没有追加选项。如何在收集文件时将传感器输出附加到文件?
使用seekToEndOfFile
let myHandle = FileHandle.init(forWritingAtPath: fileUrl.path)
myHandle.seekToEndOfFile
myHandle.write(strTowrite.data(using: String.Encoding.utf8)!)
myHandle.closeFile()
试试用这个
//MARK:- Extension for String
extension String
{
func appendLineToURL(fileURL: URL) throws
{
try (self + "\n").appendToURL(fileURL: fileURL)
}
func appendToURL(fileURL: URL) throws
{
let data = self.data(using: String.Encoding.utf8)!
try data.append(fileURL: fileURL)
}
}
//MARK:- Extension for File data
extension Data
{
func append(fileURL: URL) throws {
if let fileHandle = FileHandle(forWritingAtPath: fileURL.path)
{
defer
{
fileHandle.closeFile()
}
fileHandle.seekToEndOfFile()
fileHandle.write(self)
}
else
{
try write(to: fileURL, options: .atomic)
}
}
}
用法:
try newLine.appendToURL(fileURL: path!)
这些扩展将追加您想要做的换行,
这将仅替换路径
处的线
try newLine.write(to: fileURL, atomically: false, encoding: .utf8)
这将使用现有数据作为新行追加数据
try newLine.appendToURL(fileURL: path!)
我想在方法内更新传感器时将传感器数据写入文件。我需要在数据更新时附加数据,但当我尝试这样做时,我的文件会被最后一个传感器输出覆盖。
func startAccel(fileName: String, fileURL: URL) ->Void{ //Starting accelerometer
motionManager.accelerometerUpdateInterval = 1.0 / Double(hz) //determines refresh speed
motionManager.startAccelerometerUpdates(to: OperationQueue.current!){ (data, error) in
if let myData = data{
do{
let newLine = "Accelerometer, \(myData.acceleration.x), \(myData.acceleration.y),\(myData.acceleration.z)\n"
try newLine.write(to: fileURL, atomically: false, encoding: .utf8)
try print(String(contentsOf: fileURL, encoding:.utf8))
}catch{
print("yeah that didn't work sorry bub")
}
}
}
}
每次调用 newLine.write() 时,此代码都会覆盖文件,并且该函数没有追加选项。如何在收集文件时将传感器输出附加到文件?
使用seekToEndOfFile
let myHandle = FileHandle.init(forWritingAtPath: fileUrl.path)
myHandle.seekToEndOfFile
myHandle.write(strTowrite.data(using: String.Encoding.utf8)!)
myHandle.closeFile()
试试用这个
//MARK:- Extension for String
extension String
{
func appendLineToURL(fileURL: URL) throws
{
try (self + "\n").appendToURL(fileURL: fileURL)
}
func appendToURL(fileURL: URL) throws
{
let data = self.data(using: String.Encoding.utf8)!
try data.append(fileURL: fileURL)
}
}
//MARK:- Extension for File data
extension Data
{
func append(fileURL: URL) throws {
if let fileHandle = FileHandle(forWritingAtPath: fileURL.path)
{
defer
{
fileHandle.closeFile()
}
fileHandle.seekToEndOfFile()
fileHandle.write(self)
}
else
{
try write(to: fileURL, options: .atomic)
}
}
}
用法:
try newLine.appendToURL(fileURL: path!)
这些扩展将追加您想要做的换行,
这将仅替换路径
处的线try newLine.write(to: fileURL, atomically: false, encoding: .utf8)
这将使用现有数据作为新行追加数据
try newLine.appendToURL(fileURL: path!)