อ่านและเขียนสตริงจากไฟล์ข้อความ


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

สำหรับการอ่านและการเขียนคุณควรใช้ตำแหน่งที่สามารถเขียนได้เช่นไดเรกทอรีเอกสาร รหัสต่อไปนี้แสดงวิธีการอ่านและเขียนสตริงอย่างง่าย คุณสามารถทดสอบบนสนามเด็กเล่น

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

สวิฟท์ 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 (เส้นทาง) // 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-project (ใช้ drag'n'drop และทำเครื่องหมาย "คัดลอกไฟล์หากจำเป็น") คุณสามารถทำสิ่งต่อไปนี้ได้เช่นเดียวกับใน 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

อัปเดต:
สำหรับการอ่านไฟล์จาก Bundle (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 projets มันเลิกใช้แล้วและไม่ทำงานกับ Xcode 6.1 อีกต่อไป (รวมถึง Mac OS X)
Leo Dabus

1
คุณสามารถใช้สตริง (contentsOfFile: ... )
ชิม

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 ที่เป็นไปได้):

Swift 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 แนะนำวิธีดังกล่าว หรือคุณสามารถอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับสาเหตุที่เป็นวิธีที่แนะนำได้อย่างไร
Andrej

6
@Andrej "วัตถุ URL เป็นวิธีที่แนะนำในการอ้างถึงไฟล์ในเครื่องวัตถุส่วนใหญ่ที่อ่านข้อมูลจากหรือเขียนข้อมูลไปยังไฟล์มีวิธีการที่ยอมรับวัตถุ NSURL แทนชื่อพา ธ เป็นการอ้างอิงไฟล์" developer.apple.com/library/ios/documentation/Cocoa/Reference/…
Sverrisson

1
คุณไม่จำเป็นต้องแปลงข้อผิดพลาดเป็น NSError หรือแม้แต่ใช้ "catch let error" คุณสามารถจับได้และรับตัวแปรข้อผิดพลาดได้ฟรี
cuomo456

@ cuomo456 สิทธิ์ของคุณฉันจะลบออกมันเป็นของเหลือจาก Swift เบต้าก่อนหน้านี้
Sverrisson

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 ไม่! คุณไม่สามารถเขียนไฟล์ลงในบันเดิล
Sverrisson

ผมได้พูดคุยเกี่ยวกับการอ่านจากไฟล์มันเป็นคำตอบเดียวที่ทำงานกับฉันถ้าไฟล์ที่อยู่ในแฟ้มโครงการ
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

ฉันต้อง recode เช่นนี้:

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 ประเทศ

อย่างไรก็ตามตัวอย่างเหล่านี้ยังไม่สมบูรณ์พอที่จะใช้ในโปรแกรมจริง ฟังก์ชั่นการเขียนไม่ได้รายงานข้อผิดพลาดใด ๆ ที่สร้างหรือเขียนลงไฟล์ ในการอ่านฉันไม่คิดว่าเป็นความคิดที่ดีที่จะส่งคืนข้อผิดพลาดที่ไฟล์ไม่มีอยู่เนื่องจากสตริงที่ควรมีข้อมูลที่ถูกอ่าน คุณต้องการที่จะรู้ว่ามันล้มเหลวและทำไมผ่านกลไกการแจ้งเตือนบางอย่างเช่นข้อยกเว้น จากนั้นคุณสามารถเขียนโค้ดบางอย่างเพื่อแสดงว่าปัญหาคืออะไรและทำให้ผู้ใช้สามารถแก้ไขได้หรือ "ถูกต้อง" จะหยุดโปรแกรมที่จุดนั้น

คุณไม่ต้องการเพียงแค่ส่งคืนสตริงที่มี "ไฟล์ข้อผิดพลาดไม่มีอยู่" ในนั้น จากนั้นคุณจะต้องค้นหาข้อผิดพลาดในสตริงจากฟังก์ชั่นการโทรทุกครั้งและจัดการกับมัน คุณอาจไม่สามารถบอกได้จริง ๆ ว่าสตริงข้อผิดพลาดนั้นอ่านจากไฟล์จริงหรือถ้ามันเกิดจากรหัสของคุณ

คุณไม่สามารถเรียกการอ่านแบบนี้ได้ใน swift 2.2 และ Xcode 7.3 เพราะ NSString (contentOfFile ... ) มีข้อยกเว้น มันเป็นข้อผิดพลาดเวลารวบรวมถ้าคุณไม่มีรหัสใด ๆ ที่จะจับมันและทำอะไรกับมันเช่นพิมพ์ไปที่ stdout หรือดีกว่าหน้าต่างป๊อปอัพข้อผิดพลาดหรือ stderr ฉันได้ยินมาว่าแอปเปิลกำลังเคลื่อนไหวห่างจากการลองจับและข้อยกเว้น แต่มันจะเป็นการเคลื่อนไหวที่ยาวนานและเป็นไปไม่ได้ที่จะเขียนโค้ดโดยปราศจากสิ่งนี้ ฉันไม่ทราบว่าอาร์กิวเมนต์ & 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
}

ในหลายคำตอบของคุณฉันคิดว่าคุณไม่เข้าใจประเด็นของฉัน (หรือคุณอาจไม่สนใจและไม่เป็นไร) อย่างไรก็ตามเพื่อความชัดเจนโยนข้อยกเว้นและจัดการมันอย่างใดเมื่อคุณกำลังมองหาไฟล์ที่ไม่มี (หรือมีปัญหาอื่นเช่นการอนุญาต) จะดีกว่าการส่งคืนสตริงเช่น "ข้อผิดพลาด: ไฟล์ [ชื่อไฟล์] ไม่มี "เนื่องจากสตริงที่คุณควรจะอ่านจากไฟล์จริง จากนั้นเพียงแค่พิมพ์ หากมีสิ่งใดที่คุณควรพิมพ์รายละเอียดข้อยกเว้นไม่ใช่สตริงการอ่านที่ล้มเหลวซึ่งมีข้อผิดพลาดอยู่ในตอนนี้โปรแกรมอาจไม่ควรดำเนินการต่อไป
Sam Allen

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. Usuage:

    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

Swift 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 / คอนเทนเนอร์ / ข้อมูล / แอปพลิเคชัน / E4BF1065-3B48-4E53-AC1D-0DC893CCB498 / เอกสาร / แต่ฉันไม่พบมันในไฟล์
3069232

1
ฉันพลาดรหัสนี้ ... <key> CFBundleDisplayName </key> <string> $ {PRODUCT_NAME} </string> ทำงานใน iOS 13, Swift 5
3069232

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 สวิฟท์ 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)!)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.