Metin dosyasından bir Dize okuma ve yazma


298

Bir metin dosyasına veri okumak ve yazmak gerekiyor, ama nasıl olduğunu anlayamadım.

Bu örnek kodu Swift'in iBook'unda buldum, ancak yine de veri yazmayı veya okumayı bilmiyorum.

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

Yanıtlar:


548

Okuma ve yazma için yazılabilir bir konum kullanmalısınız, örneğin belgeler dizini. Aşağıdaki kod, basit bir dizenin nasıl okunacağını ve yazılacağını gösterir. Bir oyun alanında test edebilirsiniz.

Hızlı 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 */}
}

Hızlı 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)
}

2
let text2 = String.stringWithContentsOfFile (yol) // XCode 6.0
Matt Frear

Bu çözümü kullanmak işe yarar, ancak dosyayı açarsam içinde metin yoktur. Bir şey eksik mi?
Nuno Gonçalves

@Adam let yolundaki bu dosya nedir = dir.stringByAppendingPathComponent (file) ;?
zbz.lvlv

7
Bu kaldırılmalıdır, Swift'in yeni sürümleri için kod çalışmaz.

1
@ billy_b29 Bu satırdan sonraki kod: //readingtam olarak bunu yapar.
Adam

88

Metin dosyanızı data.txtXcode projenize taşıdığınızı varsayarsak (drag'n'drop kullanın ve "Gerekirse dosyaları kopyala" yı işaretleyin) Objective-C'deki gibi şunları yapabilirsiniz:

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

Güncelleme:
Bundle'dan (iOS) bir dosyayı okumak için şunları kullanabilirsiniz:

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

Swift 3 için güncelleme:

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

Swift 5 için

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)

3
İOS projeleri için "stringWithContentsOfFile" kullanılamıyor (iOS 7'den itibaren kullanımdan kaldırıldı)
alttag


1
String'i kullanabilirsin (contentOfFile: ...)
shim

1
iOS 10 Swift 3 ile benzer çözüm kullanım paketi burada
Zamansız

69

Xcode 8.x • Swift 3.x veya üstü

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

"Böyle bir dosya yok." Proje navigator'a .txt dosyalarımı eklediğimden ve açmaya çalıştığım için bu mesajı alıyorum. (Masaüstünde oluşturun ve proje gezginine sürükleyin)
Darvydas

56

Yeni daha basit ve önerilen yöntem: Apple, dosya işleme için URL'lerin kullanılmasını önerir ve buradaki diğer çözümler kullanımdan kaldırılmıştır (aşağıdaki yorumlara bakın). Aşağıdakiler, URL'lerle okuma ve yazma işleminin yeni basit yoludur (olası URL hatalarını ele almayı unutmayın):

Swift 5+, 4 ve 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)")
}

1
Apple'ın bu şekilde önerdiği yerlerde referans verebilir misiniz? Ya da bunun neden önerilen yol olduğunu biraz daha anlatabilir misiniz?
Andrej

6
@Andrej "URL nesneleri, yerel dosyalara başvurmak için tercih edilen yoldur. Bir dosyadan veri okuyan veya bir dosyaya veri yazan nesnelerin çoğunda, dosya adı olarak yol adı yerine NSURL nesnesini kabul eden yöntemler bulunur." developer.apple.com/library/ios/documentation/Cocoa/Reference/…
Sverrisson

1
Hataları NSError olarak yayınlamanız veya "catch let error" komutunu kullanmanız gerekmez. Sadece catch yapabilir ve hata değişkenini ücretsiz olarak alabilirsiniz.
cuomo456

@ cuomo456 Hakkınız kaldırıyorum, önceki Swift beta'dan artık.
Sverrisson

1
@Alshcompiler Create: true, FileManager'a zaten orada değilse başarısız olmak yerine dizin oluşturmasını bildirir
Sverrisson

28

Xcode 8, uygulama paketinden dosyayı okumak için Swift 3 yolu:

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

İşte kullanışlı bir kopyala yapıştır Uzantısı

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

Örneğin

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

Neredeyse her zaman bir dizi satır istersiniz:

let r:[String] = "yourFile.txt"
     .contentsOrBlank()
     .characters
     .split(separator: "\n", omittingEmptySubsequences:ignore)
     .map(String.init)

2
Ben kullanışlı bir uzantıya yapıştırdım @crashalot - silmek için çekinmeyin, alkış
Fattie

1
@Alshcompiler HAYIR! Bir dosyayı pakete yazamazsınız.
Sverrisson

Dosyadan okuma hakkında konuşuyordum, dosya proje dosyalarındaysa benimle birlikte çalışan tek cevap bu
Alsh derleyici

10

Size sadece ilk kısmı göstermek istiyorum, bu okundu . İşte böyle basit bir şekilde okuyabilirsiniz:

Hızlı 3:

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

Hızlı 2:

let s = try! String(contentsOfFile: NSBundle.mainBundle().pathForResource("myFile", ofType: "txt")!)

5

Swift> 4.0'da bir dosyayı okumanın en kolay yolu

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

3

Adam'ın yukarıdaki kabul edilen cevabının benim için bazı hataları vardı, ama işte cevabını nasıl yeniden çalıştım ve bu işi benim için yaptım.

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

3

Bu aracı yalnızca Swift'teki dosyadan okumak için değil, aynı zamanda girdinizi ayrıştırmak için de yararlı bulabilirsiniz: https://github.com/shoumikhin/StreamScanner

Sadece dosya yolunu ve bunun gibi veri sınırlayıcılarını belirtin:

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

Bu yardımcı olur umarım.


2

Ben böyle kodlamak zorunda kaldı:

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

2

İşlev örneğinde, (read | write) DocumentsFromFile (...), bazı işlev sarmalayıcılarına sahip olmak kesinlikle mantıklı görünmektedir, çünkü OSx ve iOS'taki her şeyin üç veya dört ana sınıfa başlatılması ve yapılandırılmış, bağlantılı, somutlaştırılmış ve 182 ülkede sadece bir dosyaya "Merhaba" yazmak üzere ayarlanmıştır.

Ancak, bu örnekler gerçek bir programda kullanılacak kadar tam değildir. Yazma işlevi, dosyaya yazma veya dosyaya yazma hatası bildirmez. Okunduğumda, dosyanın okunan verileri içermesi gereken dize olarak var olmayan bir hata döndürmenin iyi bir fikir olduğunu düşünmüyorum. Başarısız olduğunu ve neden, bir istisna gibi bazı bildirim mekanizması aracılığıyla bilmek istersiniz. Daha sonra, sorunun ne olduğunu ortaya çıkaran ve kullanıcının sorunu düzeltmesine izin veren bir kod yazabilir veya programı o noktada "doğru şekilde" kırabilir.

İçinde "Hata dosyası yok" olan bir dize döndürmek istemezsiniz. Sonra, her seferinde işlev çağırma dize hatası aramak ve orada işlemek gerekir. Ayrıca, hata dizesinin gerçek bir dosyadan gerçekten okunup okunmadığını veya kodunuzdan üretilip üretilmediğini gerçekten anlayamazsınız.

NSString (contentOfFile ...) bir istisna fırlattığından, hızlı 2.2 ve Xcode 7.3'te okumayı böyle çağıramazsınız. Yakalamak ve onunla bir şey yapmak, örneğin stdout'a yazdırmak veya daha iyisi, bir hata açılır penceresi veya stderr gibi bir kodunuz yoksa, derleme zamanı hatasıdır. Apple'ın deneme yakalama ve istisnalardan uzaklaştığını duydum, ancak uzun bir hareket olacak ve bu olmadan kod yazmak mümkün değil. Nerede & hata argümanı, belki de eski bir sürüm geliyor bilmiyorum, ancak NSString.writeTo [Dosya | URL] şu anda bir NSError argümanı yok. NSString.h dosyasında şöyle tanımlanırlar:

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

Ayrıca, mevcut olmayan dosya, programınızın bir dosyayı okumada olabilecek bir izin sorunu, dosya boyutu veya bir işleyiciyi kodlamayı denemek istemeyeceğiniz diğer birçok sorundan yalnızca biridir. onların her biri. Her şeyin doğru olduğunu varsaymak ve yakalamak ve yazdırmak ya da bir şey yanlış giderse bir istisna kabul etmek en iyisidir, bunun yanı sıra, bu noktada, zaten bir seçeneğiniz yoktur.

İşte yeniden yazdıklarım:

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
}

Yanıtlarınızın çoğunda benim fikrimi anlamadığınızı düşünüyorum. (ya da umurumda olmayabilir ve sorun değil). Ancak, açık olmak, bir istisna atmak ve orada olmayan (veya izin gibi başka bir sorunu olan) bir dosyayı ararken bir şekilde işlemek, "HATA: Dosya [dosyaadı] gibi bir dize döndürmekten çok daha iyi dosyadan gerçekten okumanız gereken dize olarak yok. Sonra sadece yazdırın. İstisna ayrıntılarını yazdırmanız gereken bir şey varsa, şimdi içinde bir hata olan okuma dizesi başarısız oldu.Program muhtemelen devam etmemelidir.
Sam Allen

2

Benim txt dosyası için şu şekilde çalışır:

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

2

Karışıklığı önlemek ve kolaylık sağlamak için, belge dizinindeki dosyalara dizeleri okumak ve yazmak için iki işlev oluşturdum. İşte fonksiyonları:

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
}

İşte kullanımlarına bir örnek:

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

Bu yardımcı olur umarım!

Xcode Sürümü: 6.3.2


2

En son swift3 kodu
Metin dosyasından veri okuyabilirsiniz sadece feryat kodu kullanın Bu benim metin dosyası

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

}

Swift3 metin json dosyasından veri almak bu kodu kullanabilirsiniz

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

2

Linux'ta Swift 3.1.1 ile çalışır:

import Foundation

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

1

ViewDidLoad'a yaz

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

1

Daha önceki çözümler soruyu cevaplar, ancak benim durumumda yazma sırasında dosyanın eski içeriğini silmek bir sorun oldu.

Bu nedenle, önceki içeriği silmeden belgeler dizinindeki dosyaya yazmak için bir kod parçası oluşturdum. Muhtemelen daha iyi hata işlemeye ihtiyacınız vardır, ancak bunun iyi bir başlangıç ​​noktası olduğuna inanıyorum. Swift 4. Kullanım:

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

Yardımcı yöntemler:

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

1

Hızlı 3.x - 5.x

Bunun en iyi örneği, dosya adı olarak geçerli tarih ve saatle görüntülenebilen ve gösterilebilen Logfilebir uzantıya sahip bir yerel oluşturmaktır..txt"Files App"

bu kodu info.plist dosyasına eklemeniz yeterlidir.

  UIFileSharingEnabled
  LSSupportsOpeningDocumentsInPlace

ve aşağıdaki bu fonksiyon

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

Bunu denedim, ama bir şey kaçırmış olmalı. Belgemi kaydeder ve dosyaya koyar: /// var / mobile / Kapsayıcılar / Veri / Uygulama / E4BF1065-3B48-4E53-AC1D-0DC893CCB498 / Belgeler / ama dosyalarda bulamıyorum.
user3069232

1
BU anahtarı kaçırdım ... <key> CFBundleDisplayName </key> <string> $ {PRODUCT_NAME} </string> iOS 13, Swift 5'de çalıştı
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
}

0

Xcode 8.3.2 Swift 3.x . NSKeyedArchiver ve NSKeyedUnarchiver kullanma

Belgelerden dosya okuma

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

Belgelere dosya yazma

NSKeyedArchiver.archiveRootObject(finalDataDict, toFile:(jsonFilePath?.absoluteString)!)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.