텍스트 파일에서 문자열 읽기 및 쓰기


298

텍스트 파일에서 데이터를 읽고 쓸 필요가 있지만 방법을 알 수 없었습니다.

Swift의 iBook에서이 샘플 코드를 찾았지만 여전히 데이터를 쓰거나 읽는 방법을 모르겠습니다.

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
let text2 = String.stringWithContentsOfFile (path) // XCode 6.0
Matt Frear

이 솔루션을 사용하면 효과가 있지만 파일을 열면 텍스트가 없습니다. 아무것도 빠졌습니까?
Nuno Gonçalves

@Adam let path = dir.stringByAppendingPathComponent (file);에서이 파일은 무엇입니까?
zbz.lvlv

7
새 버전의 Swift에서는 코드가 작동하지 않습니다.

1
@ billy_b29이 줄 뒤의 코드 : //reading정확히 그렇게합니다.
Adam

88

텍스트 파일 data.txt을 Xcode 프로젝트 로 옮겼다 고 가정하면 (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

업데이트 :
번들 (iOS)에서 파일을 읽으려면 다음을 사용할 수 있습니다.

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

스위프트 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)!

스위프트 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 projet과는 아무런 관련이 없으며, 더 이상 사용되지 않으며 Xcode 6.1 (Mac OS X 포함)에서 더 이상 작동하지 않습니다.
Leo Dabus

1
String (contentsOfFile : ...)을 사용할 수 있습니다.
shim

1
iOS 10 스위프트 3과 유사한 솔루션 사용 번들이 여기에 있습니다
Timeless

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이 권장하는 방법에 대한 참조를 제공 할 수 있습니까? 또는 왜 이것이 권장되는 방법인지 좀 더 자세히 설명해 주시겠습니까?
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 create : 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 compiler

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

함수 예제에서 일부 함수 래퍼가있는 (read | write) DocumentsFromFile (...)은 OSx와 iOS의 모든 인스턴스가 인스턴스화되고 구성되고 연결된 많은 속성이 필요합니다. 182 개국에서 파일에 "Hi"를 쓰도록 인스턴스화하고 설정합니다.

그러나 이러한 예제는 실제 프로그램에서 사용하기에 충분하지 않습니다. 쓰기 기능은 파일 작성 또는 쓰기 오류를보고하지 않습니다. 읽을 때, 읽은 데이터를 포함 해야하는 문자열로 파일이 존재하지 않는다는 오류를 반환하는 것은 좋은 생각이 아닙니다. 실패한 이유와 예외와 같은 알림 메커니즘을 통해 이유를 알고 싶을 것입니다. 그런 다음 문제가 무엇인지 출력하고 사용자가 문제를 해결하거나 해당 시점에서 프로그램을 "정확하게"중단시키는 코드를 작성할 수 있습니다.

"오류 파일이 없습니다"라는 문자열 만 반환하고 싶지는 않습니다. 그런 다음 매번 함수 호출에서 문자열의 오류를 찾아서 처리해야합니다. 오류 문자열이 실제 파일에서 실제로 읽혔는지 또는 코드에서 생성되었는지 실제로 알 수 없었습니다.

NSString (contentsOfFile ...)에서 예외가 발생하므로 swift 2.2 및 Xcode 7.3에서 이와 같이 읽기를 호출 할 수도 없습니다. 코드를 잡아서 stdout 또는 더 나은 방법으로 오류 팝업 창 또는 stderr에 인쇄하는 것과 같이 무언가를 수행하는 코드가 없으면 컴파일 시간 오류입니다. 애플이 try catch와 exceptions에서 멀어지고 있다고 들었지만, 오래 갈 것이므로 이것없이 코드를 작성할 수는 없습니다. 이전 버전 인 & error 인수의 출처를 모르겠지만 NSString.writeTo [File | 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
}

당신의 많은 답변에서 나는 당신이 내 요점을 이해하지 못한다고 생각합니다. (또는 신경 쓰지 않아도 괜찮습니다). 그러나 명확하지 않고 예외를 throw하고 존재하지 않는 파일을 찾거나 권한과 같은 다른 문제가있는 파일을 찾을 때 어떻게 든 처리하는 것이 "ERROR : File [filename]과 같은 문자열을 반환하는 것보다 훨씬 낫습니다. 파일에서 실제로 읽어야하는 문자열로 존재하지 않습니다. 그런 다음 인쇄하십시오. 예외 세부 정보를 인쇄 해야하는 경우 오류가 발생한 문자열을 읽지 못했습니다. 프로그램은 계속 진행해서는 안됩니다.
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)"
           }]

}

이 코드를 사용하면 swift3의 텍스트 JSON 파일에서 데이터를 얻을 수 있습니다

     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에서 Swift 3.1.1과 함께 작동합니다.

import Foundation

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

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 /에 저장하지만 파일에서 찾을 수 없습니다.
user3069232

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

엑스 코드 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.