2017-04-25 4 views
1

genau wie die Antworten hier auf SO, ich versuche, eine Textdatei anzuhängen. Mein Code sieht wie folgt aus:Anhängen an Textdatei funktioniert nicht

if countdownTimer > 0 { 
    let dir = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.CachesDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).first! 
    let fileurl = dir.URLByAppendingPathComponent(fileName) 

    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let hour = calendar.component(.Hour, fromDate: date) 
    let minutes = calendar.component(.Minute, fromDate: date) 
    let seconds = calendar.component(.Second, fromDate: date) 

    newLine = "\(hour):\(minutes):\(seconds),\(someValue),\(someValue)\n" 

    let data = newLine.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 


    if NSFileManager.defaultManager().fileExistsAtPath(fileurl!.path!) { 
     do { 
      let fileHandle = try NSFileHandle(forWritingToURL: fileurl!) 

      fileHandle.seekToEndOfFile() 
      fileHandle.writeData(data) 
      fileHandle.closeFile() 
     } catch { 
      print("Can't open fileHandle \(error)") 
     } 
    } else { 

    } 
     countdownTimer -= 1 
} 

Der Unterschied in meiner Implementierung ist, dass ich die Datei auf separaten Veranstaltung erschaffe (und ich bin sicher, dass die Datei vor dem Anhängen vorhanden) und Anhängen der Textdatei befindet sich in einem Timer welches jede Sekunde wiederholt. Was mache ich falsch? Vielen Dank.

Antwort

1

Ich schreibe Code, der Ihnen hilft zu verstehen, wo Sie einen Fehler machen könnten.

Zuerst erstellen Sie Error Typen und Dateinamen, wo wir unsere Informationen protokollieren werden.

let file = "logger1.txt" 

enum Throwing: Error { 
    case impossibleToWrite 
    case impossibleToRead 
} 

als zwei Funktionen das wird writeToFile und readFromFile.

func writeToFile(file:String, log: String) throws { 

    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { 

     let path = dir.appendingPathComponent(file) 

     do { 
      let writer = try FileHandle(forWritingTo: path) 
      writer.seekToEndOfFile() 
      writer.write(log.data(using: String.Encoding.utf8)!) 
      writer.closeFile() 
     } 
     catch { 
      throw Throwing.impossibleToWrite 
     } 
    } 
} 

func readFromFile(file:String) throws { 

    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { 

     let path = dir.appendingPathComponent(file) 

     do { 
      let text = try String(contentsOf: path, encoding: String.Encoding.utf8) 
      print(text) 
     } 
     catch { 
      throw Throwing.impossibleToRead 
     } 
    } 
} 

als kleine Schleife, die mit Datum einloggen werden iterieren und erstellen. Nutzung des Versuchs! ist eine schlechte Übung, aber zu Testzwecken ist es in Ordnung.

func logTimeInLoop() { 

    for _ in 0..<10 { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS " 
     let text = formatter.string(from: Date()) + "\n" 

     try! writeToFile(file: file, log: text) 
    } 

    try! readFromFile(file: file) 
} 

Dies ist die Ausgabe der Daten in der Datei.

enter image description here

+0

vor allem, danke für die Antwort. Ich habe versucht, Ihren Beispielcode zu implementieren (mit kleineren Revisionen, um die Syntaxfehler zu entfernen), aber ich habe immer noch das gleiche Problem. – Lysdexia

+0

@Cuevas was ist das Problem? Sie führen mein Codebeispiel aus? Wenn ja, wird es alle Daten anhängen \ –

+0

ja, ich bin Ihren Code ausgeführt, aber wenn ich Paketinhalt und durchsuchen Sie die generierte Datei, es gab keine Informationen. Es ist wirklich komisch, weil zum Beispiel hier eine andere Implementierung ist (Ich sammle Informationen, verknüpfe sie mit einer Variablen, erstelle eine Protokolldatei mit der Variablen, alle Informationen werden gedruckt), aber in diesem Fall nicht. – Lysdexia