Baca dan tulis sebuah String dari file teks

298

Saya perlu membaca dan menulis data ke / dari file teks, tetapi saya belum bisa mengetahuinya.

Saya menemukan kode sampel ini di iBook Swift, tetapi saya masih tidak tahu bagaimana menulis atau membaca data.

import Cocoa

class DataImporter
{
    /*
    DataImporter is a class to import data from an external file.
    The class is assumed to take a non-trivial amount of time to initialize.
    */
    var fileName = "data.txt"
    // the DataImporter class would provide data importing functionality here
}

class DataManager
{
    @lazy var importer = DataImporter()
    var data = String[]()
    // the DataManager class would provide data management functionality here
}

let manager = DataManager()
manager.data += "Some data"
manager.data += "Some more data"
// the DataImporter instance for the importer property has not yet been created”

println(manager.importer.fileName)
// the DataImporter instance for the importer property has now been created
// prints "data.txt”



var str = "Hello World in Swift Language."
Jorge Vega Sánchez
sumber

Jawaban:

548

Untuk membaca dan menulis, Anda harus menggunakan lokasi yang dapat ditulisi, misalnya direktori dokumen. Kode berikut menunjukkan cara membaca dan menulis string sederhana. Anda bisa mengujinya di taman bermain.

Swift 3.x - 5.x

let file = "file.txt" //this is the file. we will write to and read from it

let text = "some text" //just a text

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

    let fileURL = dir.appendingPathComponent(file)

    //writing
    do {
        try text.write(to: fileURL, atomically: false, encoding: .utf8)
    }
    catch {/* error handling here */}

    //reading
    do {
        let text2 = try String(contentsOf: fileURL, encoding: .utf8)
    }
    catch {/* error handling here */}
}

Cepat 2.2

let file = "file.txt" //this is the file. we will write to and read from it

let text = "some text" //just a text

if let dir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {
    let path = NSURL(fileURLWithPath: dir).URLByAppendingPathComponent(file)

    //writing
    do {
        try text.writeToURL(path, atomically: false, encoding: NSUTF8StringEncoding)
    }
    catch {/* error handling here */}

    //reading
    do {
        let text2 = try NSString(contentsOfURL: path, encoding: NSUTF8StringEncoding)
    }
    catch {/* error handling here */}
}

Swift 1.x

let file = "file.txt"

if let dirs : [String] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] {
    let dir = dirs[0] //documents directory
    let path = dir.stringByAppendingPathComponent(file);
    let text = "some text"

    //writing
    text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil);

    //reading
    let text2 = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)
}
Adam
sumber
2
biarkan text2 = String.stringWithContentsOfFile (path) //
XCode
Menggunakan solusi ini berfungsi, tetapi jika saya membuka file tidak ada teks di dalamnya. Apakah saya kehilangan sesuatu?
Nuno Gonçalves
@Adam Apa file ini di let path = dir.stringByAppendingPathComponent (file) ;?
zbz.lvlv
7
Ini harus dihapus, kode tidak berfungsi untuk versi baru Swift.
1
@ billy_b29 Kode setelah baris ini: //readingtidak persis seperti itu.
Adam
88

Dengan asumsi bahwa Anda telah memindahkan file teks Anda data.txtke proyek-Xcode Anda (Gunakan drag'n'drop dan centang "Salin file jika perlu") Anda dapat melakukan hal berikut seperti di Objective-C:

let bundle = NSBundle.mainBundle()
let path = bundle.pathForResource("data", ofType: "txt")        
let content = NSString.stringWithContentsOfFile(path) as String

println(content) // prints the content of data.txt

Pembaruan:
Untuk membaca file dari Bundle (iOS) Anda dapat menggunakan:

let path = NSBundle.mainBundle().pathForResource("FileName", ofType: "txt")
var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!
println(text)

Pembaruan untuk Swift 3:

let path = Bundle.main.path(forResource: "data", ofType: "txt") // file path for file "data.txt"
var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!

Untuk Swift 5

let path = Bundle.main.path(forResource: "ListAlertJson", ofType: "txt") // file path for file "data.txt"
let string = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
wottpal
sumber
3
Untuk proyek iOS, "stringWithContentsOfFile" tidak tersedia (tidak digunakan pada iOS 7)
alttag
1
Tidak ada hubungannya dengan projets iOS, ini sudah usang dan tidak berfungsi lagi dengan Xcode 6.1 (termasuk Mac OS X)
Leo Dabus
1
Anda dapat menggunakan String (contentOfFile: ...)
shim
1
solusi serupa gunakan bundel dengan iOS 10 Swift 3 di sini
Tim
69

Xcode 8.x • Cepat 3.x atau lebih baru

do {
    // get the documents folder url
    if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
        // create the destination url for the text file to be saved
        let fileURL = documentDirectory.appendingPathComponent("file.txt")
        // define the string/text to be saved
        let text = "Hello World !!!"
        // writing to disk 
        // Note: if you set atomically to true it will overwrite the file if it exists without a warning
        try text.write(to: fileURL, atomically: false, encoding: .utf8)
        print("saving was successful")
        // any posterior code goes here
        // reading from disk
        let savedText = try String(contentsOf: fileURL)
        print("savedText:", savedText)   // "Hello World !!!\n"
    }
} catch {
    print("error:", error)
}
Leo Dabus
sumber
Apa kesalahan paling umum dari "Tidak ada file seperti itu." Karena saya menambahkan file .txt saya ke navigator proyek dan kemudian saya mencoba membukanya saya mendapatkan pesan ini. (Buat di desktop dan seret ke navigator proyek)
Darvydas
56

Metode baru yang lebih sederhana dan direkomendasikan: Apple merekomendasikan penggunaan URL untuk penanganan file dan solusi lain di sini tampaknya sudah usang (lihat komentar di bawah). Berikut ini adalah cara sederhana baru membaca dan menulis dengan URL (jangan lupa untuk menangani kemungkinan kesalahan URL):

Swift 5+, 4 dan 3.1

import Foundation  // Needed for those pasting into Playground

let fileName = "Test"
let dir = try? FileManager.default.url(for: .documentDirectory, 
      in: .userDomainMask, appropriateFor: nil, create: true)

// If the directory was found, we write a file to it and read it back
if let fileURL = dir?.appendingPathComponent(fileName).appendingPathExtension("txt") {

    // Write to the file named Test
    let outString = "Write this text to the file"
    do {
        try outString.write(to: fileURL, atomically: true, encoding: .utf8)
    } catch {
        print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
    }

    // Then reading it back from the file
    var inString = ""
    do {
        inString = try String(contentsOf: fileURL)
    } catch {
        print("Failed reading from URL: \(fileURL), Error: " + error.localizedDescription)
    }
    print("Read from the file: \(inString)")
}
Sverrisson
sumber
1
Bisakah Anda memberikan referensi di mana Apple merekomendasikan cara seperti itu. Atau bisakah Anda menguraikan lebih jauh mengapa ini cara yang disarankan?
Andrej
6
@Andrej "Objek URL adalah cara yang disukai untuk merujuk ke file lokal. Sebagian besar objek yang membaca data dari atau menulis data ke file memiliki metode yang menerima objek NSURL alih-alih pathname sebagai referensi file." developer.apple.com/library/ios/documentation/Cocoa/Reference/…
Sverrisson
1
Anda tidak harus menampilkan kesalahan sebagai NSError, atau bahkan menggunakan "catch let error." Anda bisa menangkap dan mendapatkan variabel kesalahan secara gratis.
cuomo456
@ cuomo456 kanan Anda saya menghapusnya, itu adalah sisa dari beta Swift sebelumnya.
Sverrisson
1
@Alshcompiler The create: true menginformasikan FileManager untuk membuat direktori jika belum ada, bukannya gagal
Sverrisson
28

Xcode 8, cara cepat 3 untuk membaca file dari bundel aplikasi:

if let path = Bundle.main.path(forResource: filename, ofType: nil) {
    do {
        let text = try String(contentsOfFile: path, encoding: String.Encoding.utf8)
        print(text)
    } catch {
        printError("Failed to read text from \(filename)")
    }
} else {
    printError("Failed to load file from app bundle \(filename)")
} 

Berikut adalah Salinan dan tempel Ekstensi yang nyaman

public extension String {
    func contentsOrBlank()->String {
        if let path = Bundle.main.path(forResource:self , ofType: nil) {
            do {
                let text = try String(contentsOfFile:path, encoding: String.Encoding.utf8)
                return text
                } catch { print("Failed to read text from bundle file \(self)") }
        } else { print("Failed to load file from bundle \(self)") }
        return ""
    }
    }

Sebagai contoh

let t = "yourFile.txt".contentsOrBlank()

Anda hampir selalu menginginkan array baris:

let r:[String] = "yourFile.txt"
     .contentsOrBlank()
     .characters
     .split(separator: "\n", omittingEmptySubsequences:ignore)
     .map(String.init)
Crashalot
sumber
2
Saya menempel di ekstensi berguna @crashalot - jangan ragu untuk menghapus, tepuk tangan
Fattie
1
@Alshcompiler NO! Anda tidak dapat MENULIS file ke dalam bundel.
Sverrisson
Saya sedang berbicara tentang membaca dari file, itu satu-satunya jawaban yang bekerja dengan saya jika file tersebut dalam file proyek
Alsh compiler
10

Saya ingin menunjukkan kepada Anda hanya bagian pertama, yaitu membaca . Berikut cara sederhana yang dapat Anda baca:

Swift 3:

let s = try String(contentsOfFile: Bundle.main.path(forResource: "myFile", ofType: "txt")!)

Swift 2:

let s = try! String(contentsOfFile: NSBundle.mainBundle().pathForResource("myFile", ofType: "txt")!)
AKM Tariqul Islam
sumber
5

Cara termudah untuk membaca file di Swift> 4.0

 let path = Bundle.main.path(forResource: "data", ofType: "txt") // file path for file "data.txt"
        do {
            var text = try String(contentsOfFile: path!)
        }
        catch(_){print("error")}
    }
iosMentalist
sumber
3

Jawaban diterima saat ini di atas dari Adam memiliki beberapa kesalahan untuk saya, tetapi di sini adalah bagaimana saya mengerjakan ulang jawabannya dan membuat ini bekerja untuk saya.

let file = "file.txt"

let dirs: [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]

if (dirs != nil) {
    let directories:[String] = dirs!
    let dirs = directories[0]; //documents directory
    let path = dirs.stringByAppendingPathComponent(file);
    let text = "some text"

    //writing
    text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil);

    //reading
     var error:NSError?

    //reading
    let text2 = String(contentsOfFile: path, encoding:NSUTF8StringEncoding, error: &error)

    if let theError = error {
        print("\(theError.localizedDescription)")
    }
}
DCorrigan
sumber
3

Anda mungkin menemukan alat ini berguna untuk tidak hanya membaca dari file di Swift tetapi juga menguraikan input Anda: https://github.com/shoumikhin/StreamScanner

Cukup tentukan path file dan pembatas data seperti ini:

import StreamScanner

if let input = NSFileHandle(forReadingAtPath: "/file/path")
{
    let scanner = StreamScanner(source: input, delimiters: NSCharacterSet(charactersInString: ":\n"))  //separate data by colons and newlines

    while let field: String = scanner.read()
    {
        //use field
    }
}

Semoga ini membantu.

shoumikhin
sumber
2

Saya harus mengode ulang seperti ini:

let path = NSBundle.mainBundle().pathForResource("Output_5", ofType: "xml")
let text = try? NSString(contentsOfFile: path! as String, encoding: NSUTF8StringEncoding)
print(text)
Nagarjun
sumber
2

Dalam contoh fungsi, (baca | tulis) DocumentsFromFile (...) memiliki beberapa fungsi pembungkus tampaknya masuk akal karena segala sesuatu di OSx dan iOS tampaknya memerlukan tiga atau empat kelas utama yang dipakai dan banyak properti, dikonfigurasi, dihubungkan, dipakai, dan set, hanya untuk menulis "Hai" ke file, di 182 negara.

Namun, contoh-contoh ini tidak cukup lengkap untuk digunakan dalam program nyata. Fungsi tulis tidak melaporkan kesalahan apa pun yang membuat atau menulis ke file. Saat membaca, saya pikir itu bukan ide yang baik untuk mengembalikan kesalahan bahwa file tidak ada sebagai string yang seharusnya berisi data yang telah dibaca. Anda ingin tahu bahwa itu gagal dan mengapa, melalui beberapa mekanisme pemberitahuan, seperti pengecualian. Kemudian, Anda dapat menulis beberapa kode yang menampilkan apa masalahnya dan memungkinkan pengguna untuk memperbaikinya, atau "dengan benar" merusak program pada saat itu.

Anda tidak ingin hanya mengembalikan string dengan "File kesalahan tidak ada" di dalamnya. Kemudian, Anda harus mencari kesalahan dalam string dari memanggil fungsi setiap kali dan menanganinya di sana. Anda juga mungkin tidak bisa memastikan apakah string kesalahan benar-benar dibaca dari file yang sebenarnya, atau apakah itu dihasilkan dari kode Anda.

Anda bahkan tidak dapat memanggil read seperti ini di swift 2.2 dan Xcode 7.3 karena NSString (contentOfFile ...) melempar pengecualian. Ini adalah kesalahan waktu kompilasi jika Anda tidak memiliki kode untuk menangkapnya dan melakukan sesuatu dengannya, seperti mencetaknya ke stdout, atau lebih baik, jendela sembulan galat, atau stderr. Saya telah mendengar bahwa Apple menjauh dari try catch dan pengecualian, tetapi ini akan menjadi langkah yang panjang dan tidak mungkin untuk menulis kode tanpa ini. Saya tidak tahu dari mana argumen & kesalahan berasal, mungkin versi yang lebih lama, tetapi NSString.writeTo [File | URL] saat ini tidak memiliki argumen NSError. Mereka didefinisikan seperti ini di NSString.h:

public func writeToURL(url: NSURL, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws
public func writeToFile(path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws
public convenience init(contentsOfURL url: NSURL, encoding enc: UInt) throws
public convenience init(contentsOfFile path: String, encoding enc: UInt) throws

Selain itu, file yang tidak ada hanyalah salah satu dari sejumlah masalah potensial yang mungkin dimiliki program Anda ketika membaca file, seperti masalah izin, ukuran file, atau berbagai masalah lain yang Anda bahkan tidak ingin mencoba membuat kode penangan untuk masing-masing dari mereka. Yang terbaik adalah menganggap semuanya benar dan menangkap dan mencetak, atau menangani, pengecualian jika ada yang salah, selain itu, pada titik ini, Anda tidak benar-benar punya pilihan.

Inilah penulisan ulang saya:

func writeToDocumentsFile(fileName:String,value:String) {

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString!
    let path = documentsPath.stringByAppendingPathComponent(fileName)

    do {
        try value.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
    } catch let error as NSError {
        print("ERROR : writing to file \(path) : \(error.localizedDescription)")
    }

}

func readFromDocumentsFile(fileName:String) -> String {

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
    let path = documentsPath.stringByAppendingPathComponent(fileName)

    var readText : String = ""

    do {
        try readText = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) as String
    }
    catch let error as NSError {
        print("ERROR : reading from file \(fileName) : \(error.localizedDescription)")
    }
    return readText
}
Sam Allen
sumber
Dalam banyak tanggapan Anda, saya pikir Anda tidak memahami maksud saya. (atau Anda mungkin tidak peduli dan itu tidak masalah). Namun, untuk menjadi jelas, melempar pengecualian, dan menanganinya entah bagaimana ketika Anda mencari file yang tidak ada (atau memiliki masalah lain seperti izin) jauh lebih baik daripada mengembalikan string seperti "ERROR: File [filename] tidak ada "sebagai string yang seharusnya Anda baca dari file. Kemudian hanya mencetaknya. Jika ada yang harus Anda cetak rincian pengecualian, bukan string yang gagal dibaca yang sekarang memiliki kesalahan di dalamnya. Program mungkin tidak boleh hanya melanjutkan.
Sam Allen
2

Untuk file txt saya cara ini:

let myFileURL = NSBundle.mainBundle().URLForResource("listacomuni", withExtension: "txt")!
let myText = try! String(contentsOfURL: myFileURL, encoding: NSISOLatin1StringEncoding)
print(String(myText))
Alessandro Mattiuzzi
sumber
2

Untuk menghindari kebingungan dan menambah kemudahan, saya telah membuat dua fungsi untuk membaca dan menulis string ke file di direktori dokumen. Berikut fungsinya:

func writeToDocumentsFile(fileName:String,value:String) {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
    let path = documentsPath.stringByAppendingPathComponent(fileName)
    var error:NSError?
    value.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: &error)
}

func readFromDocumentsFile(fileName:String) -> String {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
    let path = documentsPath.stringByAppendingPathComponent(fileName)
    var checkValidation = NSFileManager.defaultManager()
    var error:NSError?
    var file:String

    if checkValidation.fileExistsAtPath(path) {
        file = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil) as! String
    } else {
        file = "*ERROR* \(fileName) does not exist."
    }

    return file
}

Berikut ini adalah contoh penggunaannya:

writeToDocumentsFile("MyText.txt","Hello world!")

let value = readFromDocumentsFile("MyText.txt")
println(value)  //Would output 'Hello world!'

let otherValue = readFromDocumentsFile("SomeText.txt")
println(otherValue)  //Would output '*ERROR* SomeText.txt does not exist.'

Semoga ini membantu!

Versi Xcode: 6.3.2

gooroo7
sumber
2

Kode swift3 terbaru
Anda dapat membaca data dari file teks cukup gunakan kode di bawah ini file teks saya ini

     {
"NumberOfSlices": "8",
"NrScenes": "5",
"Scenes": [{
           "dataType": "label1",
           "image":"http://is3.mzstatic.com/image/thumb/Purple19/v4/6e/81/31/6e8131cf-2092-3cd3-534c-28e129897ca9/mzl.syvaewyp.png/53x53bb-85.png",

           "value": "Hello",
           "color": "(UIColor.red)"
           }, {
           "dataType": "label2",
           "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png",
           "value": "Hi There",
           "color": "(UIColor.blue)"
           }, {
           "dataType": "label3",
           "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png",

           "value": "hi how r u ",
           "color": "(UIColor.green)"
           }, {
           "dataType": "label4",
           "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png",
           "value": "what are u doing  ",
           "color": "(UIColor.purple)"
           }, {
           "dataType": "label5",
          "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png",
           "value": "how many times ",
           "color": "(UIColor.white)"
           }, {
           "dataType": "label6",
           "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/5a/f3/06/5af306b0-7cac-1808-f440-bab7a0d18ec0/mzl.towjvmpm.png/53x53bb-85.png",
           "value": "hi how r u ",
           "color": "(UIColor.blue)"
           }, {
           "dataType": "label7",
           "image":"http://is5.mzstatic.com/image/thumb/Purple71/v4/a8/dc/eb/a8dceb29-6daf-ca0f-d037-df9f34cdc476/mzl.ukhhsxik.png/53x53bb-85.png",
           "value": "hi how r u ",
           "color": "(UIColor.gry)"
           }, {
           "dataType": "label8",
           "image":"http://is2.mzstatic.com/image/thumb/Purple71/v4/15/23/e0/1523e03c-fff2-291e-80a7-73f35d45c7e5/mzl.zejcvahm.png/53x53bb-85.png",
           "value": "hi how r u ",
           "color": "(UIColor.brown)"
           }]

}

Anda dapat menggunakan kode ini Anda mendapatkan data dari file teks json di swift3

     let filePath = Bundle.main.path(forResource: "nameoftheyourjsonTextfile", ofType: "json")


    let contentData = FileManager.default.contents(atPath: filePath!)
    let content = NSString(data: contentData!, encoding: String.Encoding.utf8.rawValue) as? String

    print(content)
    let json = try! JSONSerialization.jsonObject(with: contentData!) as! NSDictionary
    print(json)
    let app = json.object(forKey: "Scenes") as! NSArray!
    let _ : NSDictionary
    for dict in app! {
        let colorNam = (dict as AnyObject).object(forKey: "color") as! String
        print("colors are \(colorNam)")

       // let colour = UIColor(hexString: colorNam) {
       // colorsArray.append(colour.cgColor)
       // colorsArray.append(colorNam  as! UIColor)

        let value = (dict as AnyObject).object(forKey: "value") as! String
        print("the values are \(value)")
        valuesArray.append(value)

        let images = (dict as AnyObject).object(forKey: "image") as! String
        let url = URL(string: images as String)
        let data = try? Data(contentsOf: url!)
        print(data)
        let image1 = UIImage(data: data!)! as UIImage
        imagesArray.append(image1)
         print(image1)
            }
Gangireddy Rami Reddy
sumber
2

Ini bekerja dengan Swift 3.1.1 di Linux:

import Foundation

let s = try! String(contentsOfFile: "yo", encoding: .utf8)
Adam Dingle
sumber
1

tulis di ViewDidLoad

var error: NSError?
var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
var documentsDirectory = paths.first as String
var dataPath = documentsDirectory.stringByAppendingPathComponent("MyFolder")

if !NSFileManager.defaultManager().fileExistsAtPath(dataPath) {
    NSFileManager.defaultManager().createDirectoryAtPath(dataPath, withIntermediateDirectories: false, attributes: nil, error: &error)
} else {
    println("not creted or exist")
}

func listDocumentDirectoryfiles() -> [String] {
    if let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as? String {
        let myFilePath = documentDirectory.stringByAppendingPathComponent("MyFolder")
        return NSFileManager.defaultManager().contentsOfDirectoryAtPath(myFilePath, error: nil) as [String]
    }
    return []
}
NRV
sumber
1

Solusi sebelumnya menjawab pertanyaan, tetapi dalam kasus saya menghapus konten file lama saat menulis adalah masalah.

Jadi, saya membuat sepotong kode untuk menulis ke file dalam direktori dokumen tanpa menghapus konten sebelumnya. Anda mungkin perlu penanganan kesalahan yang lebih baik, tetapi saya percaya ini adalah titik awal yang baik. Swift 4. Bahasa:

    let filename = "test.txt"
    createOrOverwriteEmptyFileInDocuments(filename: filename)
    if let handle = getHandleForFileInDocuments(filename: filename) {
        writeString(string: "aaa", fileHandle: handle)
        writeString(string: "bbb", fileHandle: handle)
        writeString(string: "\n", fileHandle: handle)
        writeString(string: "ccc", fileHandle: handle)
    }

Metode pembantu:

func createOrOverwriteEmptyFileInDocuments(filename: String){
    guard let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
        debugPrint("ERROR IN createOrOverwriteEmptyFileInDocuments")
        return
    }
    let fileURL = dir.appendingPathComponent(filename)
    do {
        try "".write(to: fileURL, atomically: true, encoding: .utf8)
    }
    catch {
        debugPrint("ERROR WRITING STRING: " + error.localizedDescription)
    }
    debugPrint("FILE CREATED: " + fileURL.absoluteString)
}

private func writeString(string: String, fileHandle: FileHandle){
    let data = string.data(using: String.Encoding.utf8)
    guard let dataU = data else {
        debugPrint("ERROR WRITING STRING: " + string)
        return
    }
    fileHandle.seekToEndOfFile()
    fileHandle.write(dataU)
}

private func getHandleForFileInDocuments(filename: String)->FileHandle?{
    guard let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
        debugPrint("ERROR OPENING FILE")
        return nil
    }
    let fileURL = dir.appendingPathComponent(filename)
    do {
        let fileHandle: FileHandle? = try FileHandle(forWritingTo: fileURL)
        return fileHandle
    }
    catch {
        debugPrint("ERROR OPENING FILE: " + error.localizedDescription)
        return nil
    }
}
Szuwar_Jr
sumber
1

Swift 3.x - 5.x

Contoh terbaik adalah membuat lokal Logfiledengan ekstensi .txt yang dapat terlihat dan ditampilkan "Files App"dengan tanggal dan waktu saat ini sebagai nama file

cukup tambahkan kode ini di info.plist aktifkan kedua fitur ini

  UIFileSharingEnabled
  LSSupportsOpeningDocumentsInPlace

dan Fungsi Ini Di Bawah Ini

var logfileName : String = ""
func getTodayString() -> String{

    let date = Date()
    let calender = Calendar.current
    let components = calender.dateComponents([.year,.month,.day,.hour,.minute,.second], from: date)

    let year = components.year
    let month = components.month
    let day = components.day
    let hour = components.hour
    let minute = components.minute
    let second = components.second

    let today_string = String(year!) + "-" + String(month!) + "-" + String(day!) + "-" + String(hour!)  + "" + String(minute!) + "" +  String(second!)+".txt"

    return today_string

}

func LogCreator(){
    logfileName = getTodayString()

    print("LogCreator: Logfile Generated Named: \(logfileName)")

    let file = logfileName //this is the file. we will write to and read from it

    let text = "some text" //just a text

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

        let fileURL = dir.appendingPathComponent(file)
        let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true)[0]
        print("LogCreator: The Logs are Stored at location \(documentPath)")


        //writing
        do {
            try text.write(to: fileURL, atomically: false, encoding: .utf8)
        }
        catch {/* error handling here */}

        //reading
        do {
            let text2 = try String(contentsOf: fileURL, encoding: .utf8)
            print("LogCreator: The Detail log are :-\(text2)")
        }
        catch {/* error handling here */}
    }
}


  [1]: https://i.stack.imgur.com/4eg12.png
Shelish Vishal
sumber
Saya mencoba ini, tetapi pasti melewatkan sesuatu. Ini menyimpan dokumen saya dan meletakkannya di file: /// var / mobile / Containers / Data / Application / E4BF1065-3B48-4E53-AC1D-0DC893CCB498 / Documents / tapi saya tidak dapat menemukannya dalam file.
user3069232
1
Saya melewatkan kunci INI ... <key> CFBundleDisplayName </key> <string> $ {PRODUCT_NAME} </string> bekerja di iOS 13, Swift 5
user3069232
0
 func writeToDocumentsFile(fileName:String,value:String) {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
    let path = documentsPath.appendingPathComponent(fileName)
    do{
    try value.write(toFile: path, atomically: true, encoding: String.Encoding.utf8)
}catch{
    }
    }

func readFromDocumentsFile(fileName:String) -> String {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
    let path = documentsPath.appendingPathComponent(fileName)
    let checkValidation = FileManager.default
    var file:String

    if checkValidation.fileExists(atPath: path) {
        do{
       try file = NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue) as String
        }catch{
            file = ""
        }
        } else {
        file = ""
    }

    return file
}
maroc
sumber
0

Xcode 8.3.2 Swift 3.x . Menggunakan NSKeyedArchiver dan NSKeyedUnarchiver

Membaca file dari dokumen

let documentsDirectoryPathString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let documentsDirectoryPath = NSURL(string: documentsDirectoryPathString)!
let jsonFilePath = documentsDirectoryPath.appendingPathComponent("Filename.json")

let fileManager = FileManager.default
var isDirectory: ObjCBool = false

if fileManager.fileExists(atPath: (jsonFilePath?.absoluteString)!, isDirectory: &isDirectory) {

let finalDataDict = NSKeyedUnarchiver.unarchiveObject(withFile: (jsonFilePath?.absoluteString)!) as! [String: Any]
}
else{
     print("File does not exists")
}

Tulis file ke dokumen

NSKeyedArchiver.archiveRootObject(finalDataDict, toFile:(jsonFilePath?.absoluteString)!)
Prashant Gaikwad
sumber