Đọc và viết một chuỗi từ tệp văn bản


298

Tôi cần đọc và ghi dữ liệu đến / từ một tệp văn bản, nhưng tôi chưa thể tìm ra cách.

Tôi đã tìm thấy mã mẫu này trong iBook của Swift, nhưng tôi vẫn không biết cách viết hoặc đọc dữ liệu.

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

Câu trả lời:


547

Để đọc và viết, bạn nên sử dụng một vị trí có thể ghi, ví dụ thư mục tài liệu. Đoạn mã sau cho thấy cách đọc và viết một chuỗi đơn giản. Bạn có thể kiểm tra nó trên một sân chơi.

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

2
let text2 = String.opesWithContentsOfFile (path) // XCode 6.0
Matt Frear

Sử dụng giải pháp này hoạt động, nhưng nếu tôi mở tệp thì không có văn bản nào trong đó. Tôi có thiếu thứ gì không?
Nuno Gonçalves

@Adam Tập tin này là gì tại let path = dir.opesByAppendingPathComponent (file);?
zbz.lvlv

7
Điều này nên được loại bỏ, mã không hoạt động cho các phiên bản mới của Swift.

1
@ billy_b29 Mã sau dòng này: //readingthực hiện chính xác điều đó.
Adam

88

Giả sử rằng bạn đã di chuyển tệp văn bản data.txtcủa mình sang dự án Xcode (Sử dụng drag'n'drop và kiểm tra "Sao chép tệp nếu cần thiết"), bạn có thể thực hiện như sau trong 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

Cập nhật:
Để đọc tệp từ Bundle (iOS), bạn có thể sử dụng:

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

Cập nhật cho 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)!

Dành cho 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
Đối với các dự án iOS, "stringWithContentsOfFile" không khả dụng (không dùng nữa kể từ iOS 7)
alttag

1
Không có gì để làm với các trình chiếu iOS, nó không được dùng nữa và không hoạt động nữa với Xcode 6.1 (bao gồm cả Mac OS X)
Leo Dabus

1
bạn có thể sử dụng String (contentsOfFile: ...)
shim

1
giải pháp tương tự sử dụng gói với iOS 10 Swift 3 tại đây
Vô tận

69

Xcode 8.x • Swift 3.x trở lên

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

Những lỗi phổ biến nhất của "Không có tập tin như vậy." Bởi vì tôi đã thêm các tập tin .txt của mình vào trình điều hướng dự án và sau đó tôi cố gắng mở chúng, tôi nhận được thông báo này. (Tạo chúng trên máy tính để bàn và kéo chúng vào trình điều hướng dự án)
Darvydas

56

Phương pháp mới đơn giản hơn và được đề xuất: Apple khuyên bạn nên sử dụng URL để xử lý tệp và các giải pháp khác ở đây dường như không được dùng nữa (xem bình luận bên dưới). Sau đây là cách đọc và viết đơn giản mới với URL (đừng quên xử lý các lỗi URL có thể xảy ra):

Swift 5+, 4 và 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
Bạn có thể cung cấp một tài liệu tham khảo nơi Apple đề xuất cách đó. Hoặc bạn có thể giải thích thêm một chút về lý do tại sao đây là cách được đề xuất?
Andrej

6
@Andrej "Các đối tượng URL là cách ưa thích để tham chiếu đến các tệp cục bộ. Hầu hết các đối tượng đọc dữ liệu từ hoặc ghi dữ liệu vào tệp đều có các phương thức chấp nhận đối tượng NSURL thay vì tên đường dẫn làm tham chiếu tệp." developer.apple.com/l
Library / ios / documentation / Coloa / Reference / /

1
Bạn không phải sử dụng các lỗi như NSError hoặc thậm chí sử dụng "bắt lỗi." Bạn chỉ có thể bắt và bạn nhận được biến lỗi miễn phí.
cuomo456

@ cuomo456 bên phải của bạn Tôi xóa nó, đó là phần còn lại từ Swift beta trước đó.
Sverrisson

1
@Alshcompiler Tạo: true thông báo cho FileManager tạo thư mục nếu nó chưa có, thay vì thất bại
Sverrisson

28

Xcode 8, Swift 3 cách đọc tệp từ gói ứng dụng:

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

Đây là một bản sao tiện lợi và dán tiện ích mở rộng

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

Ví dụ

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

Bạn hầu như luôn muốn một loạt các dòng:

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

2
Tôi đã dán trong một tiện ích mở rộng tiện dụng @crashalot - thoải mái xóa, chúc mừng
Fattie

1
@Alshcompiler KHÔNG! Bạn không thể VIẾT một tập tin vào gói.
Sverrisson

Tôi đã nói về việc đọc từ tệp, đó là câu trả lời duy nhất phù hợp với tôi nếu tệp nằm trong tệp dự án
Trình biên dịch Alsh

10

Tôi muốn chỉ cho bạn phần đầu tiên, đó là đọc . Đây là cách đơn giản bạn có thể đọc:

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

5

Cách đơn giản nhất để đọc tệp trong 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

Câu trả lời được chấp nhận hiện tại ở trên từ Adam có một số lỗi đối với tôi nhưng đây là cách tôi làm lại câu trả lời của anh ấy và thực hiện công việc này cho tôi.

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

Bạn có thể thấy công cụ này hữu ích để không chỉ đọc từ tệp trong Swift mà còn phân tích cú pháp đầu vào của bạn: https://github.com/shoumikhin/StreamScanner

Chỉ cần xác định đường dẫn tệp và dấu phân cách dữ liệu như thế này:

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

Hi vọng điêu nay co ich.


2

Tôi đã phải mã hóa lại như thế này:

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

2

Trong ví dụ về chức năng, (đọc | ghi) DocumentsFromFile (...) có một số trình bao bọc chức năng dường như có ý nghĩa vì mọi thứ trong OSx và iOS dường như cần ba hoặc bốn lớp chính được khởi tạo và một loạt các thuộc tính, được định cấu hình, liên kết, khởi tạo và thiết lập, chỉ để viết "Hi" vào một tệp ở 182 quốc gia.

Tuy nhiên, những ví dụ này không đủ để sử dụng trong một chương trình thực. Hàm ghi không báo cáo bất kỳ lỗi nào khi tạo hoặc ghi vào tệp. Khi đọc, tôi không nghĩ nên trả lại lỗi rằng tệp không tồn tại dưới dạng chuỗi được cho là chứa dữ liệu đã đọc. Bạn sẽ muốn biết rằng nó đã thất bại và tại sao, thông qua một số cơ chế thông báo, giống như một ngoại lệ. Sau đó, bạn có thể viết một số mã đưa ra vấn đề là gì và cho phép người dùng sửa nó hoặc "chính xác" phá vỡ chương trình tại thời điểm đó.

Bạn sẽ không muốn trả về một chuỗi có "Tệp lỗi không tồn tại" trong đó. Sau đó, bạn sẽ phải tìm lỗi trong chuỗi từ chức năng gọi mỗi lần và xử lý nó ở đó. Bạn cũng có thể không thực sự biết được chuỗi lỗi có thực sự được đọc từ một tệp thực sự hay nếu nó được tạo ra từ mã của bạn.

Bạn thậm chí không thể gọi đọc như thế này trong swift 2.2 và Xcode 7.3 vì NSString (nội dungOfFile ...) ném ngoại lệ. Đó là lỗi thời gian biên dịch nếu bạn không có bất kỳ mã nào để bắt nó và làm một cái gì đó với nó, như in nó ra thiết bị xuất chuẩn, hoặc tốt hơn, một cửa sổ bật lên lỗi hoặc stderr. Tôi đã nghe nói rằng Apple đang tránh xa việc thử và ngoại lệ, nhưng sẽ là một bước tiến dài và không thể viết mã nếu không có điều này. Tôi không biết đối số & lỗi đến từ đâu, có lẽ là phiên bản cũ hơn, nhưng NSString.writeTo [File | URL] hiện không có đối số NSError. Chúng được định nghĩa như thế này trong 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

Ngoài ra, tệp không tồn tại chỉ là một trong một số vấn đề tiềm ẩn mà chương trình của bạn có thể đã đọc tệp, chẳng hạn như sự cố về quyền, kích thước tệp hoặc nhiều vấn đề khác mà bạn thậm chí không muốn thử xử lý mã mỗi một trong số họ. Tốt nhất là cứ cho rằng tất cả đều đúng và bắt và in, hoặc xử lý, một ngoại lệ nếu có gì đó không ổn, ngoài ra, tại thời điểm này, bạn không thực sự có lựa chọn nào.

Dưới đây là những bài viết của tôi:

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
}

Trong nhiều phản hồi của bạn, tôi nghĩ rằng bạn không nắm bắt được quan điểm của tôi. (hoặc bạn có thể không quan tâm và điều đó ổn). Tuy nhiên, để rõ ràng, ném một ngoại lệ và xử lý nó bằng cách nào đó khi bạn đang tìm kiếm một tệp không có ở đó (hoặc có một vấn đề khác như sự cho phép) tốt hơn nhiều so với trả về một chuỗi như "LRI: Tệp [tên tệp] không tồn tại "như chuỗi bạn phải đọc từ tệp. Sau đó chỉ cần in mà. Nếu bất cứ điều gì bạn nên in các chi tiết ngoại lệ, không phải là chuỗi không đọc được mà bây giờ có lỗi trong đó. Chương trình có lẽ không nên tiếp tục.
Sam Allen

2

Đối với tệp txt của tôi hoạt động theo cách này:

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

2

Để tránh nhầm lẫn và thêm dễ dàng, tôi đã tạo hai hàm để đọc và ghi chuỗi vào tệp trong thư mục tài liệu. Dưới đây là các chức năng:

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
}

Dưới đây là một ví dụ về việc sử dụng chúng:

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

Hi vọng điêu nay co ich!

Phiên bản Xcode: 6.3.2


2

Mã swift3 mới nhất
Bạn có thể đọc dữ liệu từ tệp văn bản chỉ cần sử dụng mã dưới đây Tệp văn bản của tôi

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

}

Bạn có thể sử dụng mã này để nhận dữ liệu từ tệp văn bản json trong 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)
            }

2

Điều này hoạt động với Swift 3.1.1 trên Linux:

import Foundation

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

1

viết trong 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

Các giải pháp trước đó trả lời câu hỏi, nhưng trong trường hợp của tôi, việc xóa nội dung cũ của tệp trong khi viết là một vấn đề.

Vì vậy, tôi đã tạo một đoạn mã để ghi vào tệp trong thư mục tài liệu mà không xóa nội dung trước đó. Bạn có thể cần xử lý lỗi tốt hơn, nhưng tôi tin rằng đó là điểm khởi đầu tốt. Swift 4. Công dụng:

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

Phương pháp trợ giúp:

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

Swift 3.x - 5.x

Ví dụ tốt nhất là Tạo một Địa phương Logfilecó Tiện ích mở rộng .txt có thể hiển thị và hiển thị trong "Files App"ngày và giờ hiện tại dưới dạng Tên tệp

chỉ cần thêm mã này vào info.plist kích hoạt hai tính năng này

  UIFileSharingEnabled
  LSSupportsOpeningDocumentsInPlace

và chức năng này dưới đây

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

Tôi đã thử điều này, nhưng phải bỏ lỡ một cái gì đó. Nó lưu tài liệu của tôi và đặt nó vào tệp: /// var / mobile / Container / Data / Application / E4BF1065-3B48-4E53-AC1D-0DC893CCB498 / Documents / nhưng tôi không thể tìm thấy nó trong các tệp.
dùng3069232

1
Tôi đã bỏ lỡ khóa NÀY ... <key> CFBundleDisplayName </ key> <string> $ {PRODUCT_NAME} </ string> đã hoạt động trong 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 . Sử dụng NSKeyedArchiver và NSKeyedUnarchiver

Đọc tập tin từ tài liệu

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

Viết tập tin vào tài liệu

NSKeyedArchiver.archiveRootObject(finalDataDict, toFile:(jsonFilePath?.absoluteString)!)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.