私はすでに読んだテキストファイルからデータを読み書きする
テキスト ファイルの末尾にデータ (文字列) を追加する必要があります。
これを行う 1 つの明白な方法は、ディスクからファイルを読み取り、その末尾に文字列を追加して書き戻すことですが、特に大きなファイルを頻繁に処理する場合は効率的ではありません。
質問は、「ファイルを読み取ってすべてを書き戻すことなく、テキスト ファイルの末尾に文字列を追加する方法」です。
これまでのところ、私は次のことをやっています:
let dir:NSURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.CachesDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last as NSURL
let fileurl = dir.URLByAppendingPathComponent("log.txt")
var err:NSError?
// until we find a way to append stuff to files
if let current_content_of_file = NSString(contentsOfURL: fileurl, encoding: NSUTF8StringEncoding, error: &err) {
"\(current_content_of_file)\n\(NSDate()) -> \(object)".writeToURL(fileurl, atomically: true, encoding: NSUTF8StringEncoding, error: &err)
}else {
"\(NSDate()) -> \(object)".writeToURL(fileurl, atomically: true, encoding: NSUTF8StringEncoding, error: &err)
}
if err != nil{
println("CANNOT LOG: \(err)")
}
ベストアンサー1
以下は、PointZeroTwo の回答を Swift 3.0 で更新したものですが、1 つ注意点があります。プレイグラウンドのテストでは単純なファイルパスを使用しても機能しますが、実際のアプリでは、.documentDirectory (または読み取りと書き込みに使用するために選択したディレクトリ - アプリ全体で一貫していることを確認してください) を使用して URL を構築する必要がありました。
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)
}
}
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)
}
}
}
//test
do {
let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! as URL
let url = dir.appendingPathComponent("logFile.txt")
try "Test \(Date())".appendLineToURL(fileURL: url as URL)
let result = try String(contentsOf: url as URL, encoding: String.Encoding.utf8)
}
catch {
print("Could not write to file")
}
PointZeroTwoに感謝します。