2016-06-01 13 views
9

Ich weiß, dass es ein paar Fragen dazu gibt, aber sie sind in Objective-C.Wie kann man auf die Datei zugreifen, die im App-Bundle von Swift enthalten ist?

Wie kann ich auf eine .txt Datei in meinem App enthalten mit Swift auf einem tatsächlichen iPhone? Ich möchte in der Lage sein, davon zu lesen und zu schreiben. Here sind meine Projektdateien, wenn Sie einen Blick darauf werfen wollen. Ich bin glücklich, Details hinzuzufügen, wenn nötig.

+1

"Ich möchte lesen und schreiben können." Sie können nicht. Wenn das App-Paket auf einem Gerät installiert ist, ist es ** schreibgeschützt **. Sie können eine Datei in Ihrem App-Paket lesen, aber Sie können nicht darauf schreiben. –

Antwort

12

einfach, indem Sie im App-Bundle für die Ressource suchen

var filePath = NSBundle.mainBundle().URLForResource("file", withExtension: "txt") 

jedoch nicht darauf schreiben kann, weil es in der App-Ressourcen-Verzeichnis ist, und Sie haben es im Dokumentenverzeichnis erstellen, um zu schreiben

es
var documentsDirectory: NSURL? 
var fileURL: NSURL? 

documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last! 
fileURL = documentsDirectory!.URLByAppendingPathComponent("file.txt") 

if (fileURL!.checkResourceIsReachableAndReturnError(nil)) { 
    print("file exist") 
}else{ 
    print("file doesnt exist") 
    NSData().writeToURL(fileURL!,atomically:true) 
} 

jetzt können Sie es zugreifen fileURL

+0

Mit "it" meinen Sie die schreibbare Datei in das Dokumentenverzeichnis kopiert? – atirit

+0

"Jetzt können Sie von fileURL darauf zugreifen" ich meine die Datei erstellt nicht die enthaltene und seine beschreibbare – Karim

+0

die Datei wird nicht kopiert eine neue leere Datei – Karim

1

Bundles nur gelesen werden. Sie können NSBundle.mainBundle().pathForResource verwenden, um auf die Datei als schreibgeschützt zuzugreifen, aber für den Schreib-/Lesezugriff müssen Sie Ihr Dokument in den Ordner "Documents" oder den Ordner "tmp" kopieren.

8

Swift 3, basierend auf Karim’s answer.

Lesen

Sie Dateien enthalten die in einer App Bündel durch die Ressource lesen kann das Bundle:

let fileURL = Bundle.main.url(forResource:"filename", withExtension: "txt") 

Schreiben

Sie können jedoch nicht dort schreiben. Sie müssen eine Kopie, vorzugsweise im Verzeichnis Dokumente erstellen:

func makeWritableCopy(named destFileName: String, ofResourceFile originalFileName: String) throws -> URL { 
    // Get Documents directory in app bundle 
    guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else { 
     fatalError("No document directory found in application bundle.") 
    } 

    // Get URL for dest file (in Documents directory) 
    let writableFileURL = documentsDirectory.appendingPathComponent(destFileName) 

    // If dest file doesn’t exist yet 
    if (try? writableFileURL.checkResourceIsReachable()) == nil { 
     // Get original (unwritable) file’s URL 
     guard let originalFileURL = Bundle.main.url(forResource: originalFileName, withExtension: nil) else { 
      fatalError("Cannot find original file “\(originalFileName)” in application bundle’s resources.") 
     } 

     // Get original file’s contents 
     let originalContents = try Data(contentsOf: originalFileURL) 

     // Write original file’s contents to dest file 
     try originalContents.write(to: writableFileURL, options: .atomic) 
     print("Made a writable copy of file “\(originalFileName)” in “\(documentsDirectory)\\\(destFileName)”.") 

    } else { // Dest file already exists 
     // Print dest file contents 
     let contents = try String(contentsOf: writableFileURL, encoding: String.Encoding.utf8) 
     print("File “\(destFileName)” already exists in “\(documentsDirectory)”.\nContents:\n\(contents)") 
    } 

    // Return dest file URL 
    return writableFileURL 
} 

Beispiel Nutzung:

let stuffFileURL = try makeWritableCopy(named: "Stuff.txt", ofResourceFile: "Stuff.txt") 
try "New contents".write(to: stuffFileURL, atomically: true, encoding: String.Encoding.utf8) 
3

Nur ein kurzes Update für die Verwendung dieses Codes mit Swift 4:

Bundle.main.url(forResource:"YourFile", withExtension: "FileExtension") 

Und das Folgende wurde aktualisiert, um das Schreiben der Datei zu berücksichtigen:

var myData: Data! 

func checkFile() { 
    if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last { 
     let fileURL = documentsDirectory.appendingPathComponent("YourFile.extension") 
     do { 
      let fileExists = try fileURL.checkResourceIsReachable() 
      if fileExists { 
       print("File exists") 
      } else { 
       print("File does not exist, create it") 
       writeFile(fileURL: fileURL) 
      } 
     } catch { 
      print(error.localizedDescription) 
     } 
    } 
} 

func writeFile(fileURL: URL) { 
    do { 
     try myData.write(to: fileURL) 
    } catch { 
     print(error.localizedDescription) 
    } 
} 

Dieses spezielle Beispiel ist nicht das flexibelste, aber mit ein wenig Arbeit können Sie einfach Ihre eigenen Dateinamen, Erweiterungen und Datenwerte übergeben.