Lesen und schreiben Sie einen String aus einer Textdatei

298

Ich muss Daten in / aus einer Textdatei lesen und schreiben, konnte aber nicht herausfinden, wie.

Ich habe diesen Beispielcode im iBook des Swift gefunden, weiß aber immer noch nicht, wie ich Daten schreiben oder lesen soll.

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
quelle

Antworten:

547

Zum Lesen und Schreiben sollten Sie einen beschreibbaren Speicherort verwenden, z. B. das Dokumentenverzeichnis. Der folgende Code zeigt, wie eine einfache Zeichenfolge gelesen und geschrieben wird. Sie können es auf einem Spielplatz testen.

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 */}
}

Swift 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
quelle
2
let text2 = String.stringWithContentsOfFile (Pfad) // XCode 6.0
Matt Frear
Die Verwendung dieser Lösung funktioniert, aber wenn ich die Datei öffne, ist kein Text darin. Vermisse ich etwas
Nuno Gonçalves
@Adam Was ist diese Datei unter let path = dir.stringByAppendingPathComponent (Datei);?
zbz.lvlv
7
Dies sollte entfernt werden, Code funktioniert nicht für neue Versionen von Swift.
1
@ billy_b29 Der Code nach dieser Zeile: //readingmacht genau das.
Adam
88

Angenommen, Sie haben Ihre Textdatei data.txtin Ihr Xcode-Projekt verschoben (verwenden Sie drag'n'drop und aktivieren Sie "Dateien bei Bedarf kopieren"), können Sie wie in Objective-C Folgendes tun:

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

Update:
Zum Lesen einer Datei aus Bundle (iOS) können Sie Folgendes verwenden:

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

Update für 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)!

Für 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
quelle
3
Für iOS-Projekte ist "stringWithContentsOfFile" nicht verfügbar (veraltet ab iOS 7)
alttag
1
Nichts mit iOS-Projekten zu tun, es ist veraltet und funktioniert nicht mehr mit Xcode 6.1 (einschließlich Mac OS X)
Leo Dabus
1
Sie können String (contentOfFile: ...)
Shim
1
ähnliche Lösung verwenden Bundle mit iOS 10 Swift 3 hier
Timeless
69

Xcode 8.x • Swift 3.x oder höher

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
quelle
Was sind die häufigsten Fehler von "Es gibt keine solche Datei." Da ich meine TXT-Dateien zum Projektnavigator hinzugefügt habe und dann versuche, sie zu öffnen, wird diese Meldung angezeigt. (Erstellen Sie sie auf dem Desktop und ziehen Sie sie in den Projektnavigator)
Darvydas
56

Neue einfachere und empfohlene Methode: Apple empfiehlt die Verwendung von URLs für die Dateihandhabung, und die anderen Lösungen hier scheinen veraltet zu sein (siehe Kommentare unten). Das Folgende ist die neue einfache Methode zum Lesen und Schreiben mit URLs (vergessen Sie nicht, die möglichen URL-Fehler zu behandeln):

Swift 5+, 4 und 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
quelle
1
Können Sie eine Referenz angeben, wo Apple dies empfiehlt? Oder können Sie etwas näher erläutern, warum dies der empfohlene Weg ist?
Andrej
6
@Andrej "URL-Objekte sind die bevorzugte Methode, um auf lokale Dateien zu verweisen. Die meisten Objekte, die Daten aus einer Datei lesen oder in eine Datei schreiben, verfügen über Methoden, die ein NSURL-Objekt anstelle eines Pfadnamens als Dateireferenz akzeptieren." developer.apple.com/library/ios/documentation/Cocoa/Reference/…
Sverrisson
1
Sie müssen die Fehler nicht als NSError umwandeln oder sogar "catch let error" verwenden. Sie können einfach fangen und Sie erhalten die Fehlervariable kostenlos.
cuomo456
@ cuomo456 dein Recht Ich entferne es, es ist ein Überbleibsel aus der vorherigen Swift Beta.
Sverrisson
1
@Alshcompiler Das create: true weist FileManager an, das Verzeichnis zu erstellen, wenn es nicht bereits vorhanden ist, anstatt zu scheitern
Sverrisson
28

Xcode 8, Swift 3-Methode zum Lesen von Dateien aus dem App-Bundle:

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)")
} 

Hier ist eine praktische Erweiterung zum Kopieren und Einfügen

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 ""
    }
    }

Beispielsweise

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

Sie möchten fast immer eine Reihe von Zeilen:

let r:[String] = "yourFile.txt"
     .contentsOrBlank()
     .characters
     .split(separator: "\n", omittingEmptySubsequences:ignore)
     .map(String.init)
Crashalot
quelle
2
Ich habe in eine handliche Erweiterung @crashalot eingefügt - zögern Sie nicht zu löschen, Prost
Fattie
1
@Alshcompiler NEIN! Sie können keine Datei in das Bundle schreiben.
Sverrisson
Ich habe über das Lesen aus einer Datei gesprochen, es ist die einzige Antwort, die bei mir funktioniert hat, wenn sich die Datei in Projektdateien befindet
Alsh-Compiler
10

Ich möchte Ihnen nur den ersten Teil zeigen, der gelesen wird . So einfach können Sie lesen:

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
quelle
5

Einfachste Möglichkeit, eine Datei in Swift> 4.0 zu lesen

 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
quelle
3

Die aktuell akzeptierte Antwort von Adam hatte einige Fehler für mich, aber hier ist, wie ich seine Antwort überarbeitet und diese Arbeit für mich gemacht habe.

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
quelle
3

Sie können dieses Tool nützlich finden, um nicht nur in Swift aus einer Datei zu lesen, sondern auch Ihre Eingaben zu analysieren: https://github.com/shoumikhin/StreamScanner

Geben Sie einfach den Dateipfad und die Datenbegrenzer wie folgt an:

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
    }
}

Hoffe das hilft.

Shoumikhin
quelle
2

Ich musste so umkodieren:

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

Im Funktionsbeispiel scheint (read | write) DocumentsFromFile (...) mit einigen Funktionsumschlägen sicherlich sinnvoll zu sein, da für alles in OSx und iOS drei oder vier Hauptklassen instanziiert und eine Reihe von Eigenschaften konfiguriert, verknüpft, verknüpft werden müssen. instanziiert und eingestellt, nur um "Hallo" in eine Datei in 182 Ländern zu schreiben.

Diese Beispiele sind jedoch nicht vollständig genug, um in einem realen Programm verwendet zu werden. Die Schreibfunktion meldet keine Fehler beim Erstellen oder Schreiben in die Datei. Beim Lesen halte ich es nicht für eine gute Idee, einen Fehler zurückzugeben, dass die Datei nicht als Zeichenfolge vorhanden ist, die die gelesenen Daten enthalten soll. Sie möchten wissen, dass es fehlgeschlagen ist und warum, durch einen Benachrichtigungsmechanismus, wie eine Ausnahme. Anschließend können Sie Code schreiben, der das Problem ausgibt und es dem Benutzer ermöglicht, es zu beheben, oder das Programm an diesem Punkt "korrekt" unterbricht.

Sie möchten nicht einfach eine Zeichenfolge mit der Aufschrift "Fehlerdatei existiert nicht" zurückgeben. Dann müssten Sie jedes Mal nach dem Fehler in der Zeichenfolge suchen, wenn Sie die Funktion aufrufen, und ihn dort behandeln. Möglicherweise konnten Sie auch nicht wirklich feststellen, ob die Fehlerzeichenfolge tatsächlich aus einer tatsächlichen Datei gelesen wurde oder ob sie aus Ihrem Code erstellt wurde.

Sie können den Lesevorgang in Swift 2.2 und Xcode 7.3 nicht einmal so aufrufen, da NSString (contentOfFile ...) eine Ausnahme auslöst. Es ist ein Fehler bei der Kompilierung, wenn Sie keinen Code haben, um ihn abzufangen und etwas damit zu tun, z. B. Drucken auf stdout oder besser ein Fehler-Popup-Fenster oder stderr. Ich habe gehört, dass Apple sich von Try Catch und Ausnahmen entfernt, aber es wird ein langer Schritt sein und es ist nicht möglich, Code ohne dies zu schreiben. Ich weiß nicht, woher das Argument & error stammt, möglicherweise eine ältere Version, aber NSString.writeTo [Datei | URL] hat derzeit kein NSError-Argument. Sie sind in NSString.h wie folgt definiert:

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

Die nicht vorhandene Datei ist nur eines von vielen potenziellen Problemen, die Ihr Programm beim Lesen einer Datei haben kann, z. B. ein Berechtigungsproblem, die Dateigröße oder zahlreiche andere Probleme, für die Sie nicht einmal versuchen möchten, einen Handler zu codieren jeder von Ihnen. Es ist am besten, einfach davon auszugehen, dass alles korrekt ist, und eine Ausnahme zu fangen und zu drucken oder zu behandeln, wenn etwas nicht stimmt. Außerdem haben Sie zu diesem Zeitpunkt ohnehin keine Wahl.

Hier sind meine Umschreibungen:

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
quelle
In vielen Ihrer Antworten denke ich, dass Sie meinen Standpunkt nicht verstehen. (oder es ist dir vielleicht egal und das ist ok). Es ist jedoch weitaus besser, eine Ausnahme auszulösen und sie irgendwie zu behandeln, wenn Sie nach einer Datei suchen, die nicht vorhanden ist (oder ein anderes Problem wie eine Berechtigung aufweist), als eine Zeichenfolge wie "ERROR: File [Dateiname] zurückzugeben. existiert nicht "als die Zeichenfolge, die Sie eigentlich aus der Datei lesen sollten. Dann drucken Sie das einfach aus. Wenn überhaupt, sollten Sie die Ausnahmedetails drucken, nicht die nicht lesbare Zeichenfolge, die jetzt einen Fehler enthält. Das Programm sollte wahrscheinlich nicht einfach fortgesetzt werden.
Sam Allen
2

Für meine txt-Datei funktioniert das so:

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

Um Verwirrung zu vermeiden und die Arbeit zu vereinfachen, habe ich zwei Funktionen zum Lesen und Schreiben von Zeichenfolgen in Dateien im Dokumentenverzeichnis erstellt. Hier sind die Funktionen:

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
}

Hier ist ein Beispiel für ihre Verwendung:

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.'

Hoffe das hilft!

Xcode-Version: 6.3.2

gooroo7
quelle
2

Neuester swift3-Code
Sie können Daten aus einer Textdatei lesen. Verwenden Sie einfach den folgenden Code. Dies ist meine Textdatei

     {
"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)"
           }]

}}

Mit diesem Code können Sie Daten aus der Text-JSON-Datei in swift3 abrufen

     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
quelle
2

Dies funktioniert mit Swift 3.1.1 unter Linux:

import Foundation

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

Schreiben Sie in 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
quelle
1

Frühere Lösungen beantworten Fragen, aber in meinem Fall war das Löschen des alten Inhalts der Datei während des Schreibens ein Problem.

Also habe ich einen Code zum Schreiben in eine Datei im Dokumentenverzeichnis erstellt, ohne vorherigen Inhalt zu löschen. Sie brauchen wahrscheinlich eine bessere Fehlerbehandlung, aber ich glaube, es ist ein guter Ausgangspunkt. Swift 4. Verwendung:

    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)
    }

Hilfsmethoden:

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
quelle
1

Swift 3.x - 5.x.

Das beste Beispiel ist das Erstellen eines lokalen Objekts Logfilemit einer Erweiterung .txt , die im "Files App"Dateinamen mit dem aktuellen Datum und der aktuellen Uhrzeit angezeigt und angezeigt werden kann

Fügen Sie einfach diesen Code in info.plist hinzu und aktivieren Sie diese beiden Funktionen

  UIFileSharingEnabled
  LSSupportsOpeningDocumentsInPlace

und diese Funktion unten

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
Vishal Shelake
quelle
Ich habe es versucht, muss aber etwas verpasst haben. Es speichert mein Dokument und legt es in der folgenden Datei ab: /// var / mobile / Containers / Data / Application / E4BF1065-3B48-4E53-AC1D-0DC893CCB498 / Documents /, aber ich kann es nicht in Dateien finden.
user3069232
1
Ich habe DIESEN Schlüssel verpasst ... <key> CFBundleDisplayName </ key> <string> $ {PRODUCT_NAME} </ string> funktionierte in 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
quelle
0

Xcode 8.3.2 Swift 3.x. . Verwenden von NSKeyedArchiver und NSKeyedUnarchiver

Datei aus Dokumenten lesen

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")
}

Datei in Dokumente schreiben

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