Прочитайте та запишіть рядок із текстового файлу


298

Мені потрібно читати та записувати дані в / з текстового файлу, але я не зміг зрозуміти, як це зробити.

Я знайшов цей зразок коду у iBook Swift, але досі не знаю, як записати чи прочитати дані.

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

Відповіді:


547

Для читання та запису слід використовувати розташування, яке можна записати, наприклад каталог документів. Наступний код показує, як читати та писати простий рядок. Ви можете протестувати його на дитячому майданчику.

Швидкий 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 */}
}

Швидкий 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 */}
}

Швидкий 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
нехай text2 = String.stringWithContentsOfFile (path) // XCode 6.0
Matt Frear

Використання цього рішення працює, але якщо я відкрию файл, у ньому немає тексту. Я щось пропускаю?
Nuno Gonçalves

@Adam Що це за файл у let path = dir.stringByAppendingPathComponent (файл) ;?
zbz.lvlv

7
Це потрібно видалити, код не працює для нових версій Swift.

1
@ billy_b29 Код після цього рядка: //readingробить саме це.
Адам

88

Якщо припустити, що ви перемістили свій текстовий файл data.txtу свій Xcode-проект (Використовуйте перетягування та встановіть прапорець "Копіювати файли, якщо потрібно"), ви можете зробити наступне, як у 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

Оновлення:
для читання файлу з пакету (iOS) ви можете використовувати:

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

Оновлення для 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)!

Для 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)

3
Для проектів iOS "stringWithContentsOfFile" недоступний (застаріло станом на iOS 7)
alttag

1
Нічого не стосується проектів на iOS, він застарілий і більше не працює з Xcode 6.1 (включаючи Mac OS X)
Leo Dabus

1
ви можете використовувати String (contentOfFile: ...)
shim

1
подібне рішення використовуйте пакет із iOS 10 Swift 3 тут
Безстроковий

69

Xcode 8.x • Swift 3.x або пізнішої версії

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

Які найпоширеніші помилки "Немає такого файлу". Оскільки я додав свої .txt файли в навігатор проектів, а потім я намагаюся їх відкрити, я отримую це повідомлення. (Створіть їх на робочому столі та перетягніть їх до навігатора проектів)
Darvydas

56

Новий простіший і рекомендований метод: Apple рекомендує використовувати URL-адреси для обробки файлів, а інші рішення тут здаються застарілими (див. Коментарі нижче). Нижче наведено новий простий спосіб читання та запису з URL-адресами (не забудьте впоратися з можливими помилками URL-адреси):

Швидкі 5+, 4 та 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 рекомендує такий спосіб. Або ви можете детальніше розібратися, чому це рекомендований спосіб?
Андрій

6
@Andrej "Об'єкти URL є кращим способом посилання на локальні файли. Більшість об'єктів, які читають дані з файлу або записують дані у файл, мають методи, які приймають об'єкт NSURL замість імені шляху в якості посилання на файл." developer.apple.com/library/ios/documentation/Cocoa/Reference/…
Sverrisson

1
Вам не доведеться ставити помилки як NSError або навіть використовувати "catch let error". Ви можете просто зробити улов, і ви отримаєте змінну помилок безкоштовно.
cuomo456

@ cuomo456 ваше право я видаляю, це залишок від попередньої бета-версії Swift.
Сверріссон

1
@Alshcompiler Створення: true повідомляє FileManager створити каталог, якщо його вже немає, замість відмови
Sverrisson

28

Xcode 8, Swift 3 спосіб зчитувати файл із пакета програм:

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

Ось зручна копія та вставлення розширення

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

Наприклад

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

Ви майже завжди хочете масив рядків:

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

2
Я вклеював зручне розширення @crashalot - сміливо видаляйте, ура!
Fattie

1
@Alshcompiler НІ! Ви не можете ЗАписати файл у пакет.
Сверріссон

Я говорив про читання з файлу, це єдина відповідь, яка працювала зі мною, якщо файл знаходиться у файлах проекту
компілятор Alsh

10

Я хочу показати вам лише першу частину, яку читають . Ось як просто ви можете прочитати:

Швидкий 3:

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

Швидкий 2:

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

5

Найпростіший спосіб прочитати файл у 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")}
    }

3

Поточна прийнята відповідь від Адама мала деякі помилки для мене, але ось, як я переробив його відповідь і зробив цю роботу для мене.

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

Цей інструмент може бути корисним не лише для читання з файлу в Swift, але і для аналізу ваших даних: https://github.com/shoumikhin/StreamScanner

Просто вкажіть шлях файлу та роздільники даних на зразок цього:

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

Сподіваюся, це допомагає.


2

Мені довелося перекодувати так:

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

2

На прикладі функцій (читати | записувати) DocumentsFromFile (...), що має деякі обгортки функцій, звичайно, мабуть, є сенс, оскільки все, що працює в OSx та iOS, потребує трьох-чотирьох основних класів, а також властивості, налаштовані, пов'язані, ініціювати та встановити, просто написати "Привіт" у файл у 182 країнах.

Однак ці приклади недостатньо повно для використання в реальній програмі. Функція запису не повідомляє про помилки під час створення чи запису у файл. Щодо прочитаного, я не думаю, що було б гарною ідеєю повернути помилку, що файл не існує як рядок, який повинен містити прочитані дані. Ви хотіли б знати, що це не вдалося, і чому, через якийсь механізм оповіщення, як виняток. Потім ви можете написати якийсь код, який виводить проблему і дозволяє користувачеві її виправити, або "правильно" порушує програму в цей момент.

Ви не хотіли б просто повернути рядок з файлом "Помилка не існує". Тоді вам доведеться щоразу шукати помилку в рядку від функції виклику та обробляти її там. Ви також, ймовірно, не могли сказати, чи насправді рядок помилок читався з фактичного файлу чи він був створений з вашого коду.

Ви навіть не можете викликати таке читання у швидкому 2.2 та Xcode 7.3, оскільки NSString (contentOfFile ...) кидає виняток. Це помилка часу компіляції, якщо у вас немає жодного коду, щоб виловити його і зробити щось з ним, наприклад, надрукувати його в stdout, а ще краще - спливаюче вікно помилок або stderr. Я чув, що Apple відходить від спроб вилову та винятків, але це буде довгий крок, і неможливо написати код без цього. Я не знаю, звідки береться аргумент & error, можливо, старша версія, але NSString.writeTo [Файл | URL] наразі не має аргументу NSError. Вони визначені так у 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

Крім того, файл, який не існує, є лише однією з низки потенційних проблем, які може мати ваша програма при читанні файлу, наприклад, проблема з дозволом, розмір файлу або численні інші проблеми, для яких ви навіть не хочете спробувати кодувати обробник. кожен з них. Найкраще просто припустити, що це все правильно, і вилучити та надрукувати або роздрукувати, виняток, якщо щось не в порядку, до того ж, у цей момент у вас дійсно немає вибору.

Ось мої переписування:

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
}

У багатьох ваших відповідях я думаю, що ви не розумієте мою думку. (або вам може бути байдуже, і це нормально). Однак, щоб бути зрозумілим, викидати виняток і якось обробляти його, коли ви шукаєте файл, якого немає (або має іншу проблему, таку як дозвіл), набагато краще, ніж повернути рядок типу "ПОМИЛКА: Файл [ім'я файлу]" не існує ", оскільки рядок, яку ви мали насправді прочитати з файлу. Тоді просто друкуючи це. Якщо у вас є що-небудь, ви повинні надрукувати дані про винятки, а не строку, яку не вдалося прочитати, в якій тепер є помилка. Програма, ймовірно, не повинна просто продовжуватись.
Сем Аллен

2

Для мого файлу txt працює так:

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

2

Щоб уникнути плутанини та додати легкості, я створив дві функції для читання та запису рядків у файли в каталозі документів. Ось функції:

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
}

Ось приклад їх використання:

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

Сподіваюсь, це допомагає!

Версія Xcode: 6.3.2


2

Останній код swift3
Ви можете прочитати дані з текстового файлу, просто скористайтеся наведеним нижче кодом Цей мій текстовий файл

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

}

За допомогою цього коду ви можете отримати дані з текстового файлу json у 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)
            }


1

пишіть у 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 []
}

1

Раніші рішення відповідали на питання, але в моєму випадку видалення старого вмісту файлу під час написання було проблемою.

Отже, я створив фрагмент коду для написання файлів у каталог документів, не видаляючи попередній вміст. Вам, мабуть, потрібні кращі поводження з помилками, але я вважаю, що це хороша відправна точка. Швидкий 4. Використання:

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

Допоміжні методи:

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

Швидкий 3.x - 5.x

Найкращим прикладом є створення локального Logfileз розширенням, .txt яке може бути видимим і відображатися у "Files App"поточній даті та Часі у вигляді імені файлу

просто додайте цей код у info.plist, щоб увімкнути ці дві функції

  UIFileSharingEnabled
  LSSupportsOpeningDocumentsInPlace

і ця функція нижче

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

Я спробував це, але, мабуть, щось пропустив. Він зберігає мій документ і додає його у файл: /// var / mobile / Containers / Data / Application / E4BF1065-3B48-4E53-AC1D-0DC893CCB498 / Documents /, але я не можу його знайти у файлах.
користувач3069232

1
Я пропустив ЦІЙ ключ ... <key> CFBundleDisplayName </key> <string> $ {PRODUCT_NAME} </string> працював в 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
}

0

Xcode 8.3.2 Swift 3.x . Використання NSKeyedArchiver та NSKeyedUnarchiver

Зчитування файлу з документів

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

Запишіть файл у документи

NSKeyedArchiver.archiveRootObject(finalDataDict, toFile:(jsonFilePath?.absoluteString)!)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.