Как получить доступ к файлу, включенному в пакет приложений в Swift?
Я знаю, что есть несколько вопросов, касающихся этого, но они находятся в Objective-C.
Как я могу получить доступ к .txt
файл включен в мое приложение с помощью Swift на реальном iPhone? Я хочу уметь читать и писать по ней. здесь мои файлы проекта, если вы захотите взглянуть. Я с удовольствием добавлю детали, если это необходимо.
4 ответов
просто путем поиска в пакете приложений для ресурса
var filePath = NSBundle.mainBundle().URLForResource("file", withExtension: "txt")
однако вы не можете написать ему, потому что он находится в каталоге ресурсов приложения, и вы должны создать его в каталоге документов для записи в него
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)
}
вы можете получить доступ к нему из fileURL
EDIT-28 августа 2018
вот как это сделать в Swift 4.2
var filePath = Bundle.main.url(forResource: "file", withExtension: "txt")
чтобы создать его в документе каталог
if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last {
let fileURL = documentsDirectory.appendingPathComponent("file.txt")
do {
if try fileURL.checkResourceIsReachable() {
print("file exist")
} else {
print("file doesnt exist")
do {
try Data().write(to: fileURL)
} catch {
print("an error happened while creating the file")
}
}
} catch {
print("an error happened while checking for the file")
}
}
Swift 3 на основе Карима.
чтение
вы можете читать файлы, включенные в пакет приложения через ресурс пакета:
let fileURL = Bundle.main.url(forResource:"filename", withExtension: "txt")
писать
однако, вы не можете писать там. Вам нужно будет создать копию, желательно в каталоге Documents:
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
}
пример использования:
let stuffFileURL = try makeWritableCopy(named: "Stuff.txt", ofResourceFile: "Stuff.txt")
try "New contents".write(to: stuffFileURL, atomically: true, encoding: String.Encoding.utf8)
просто быстрое обновление для использования этого кода с Swift 4:
Bundle.main.url(forResource:"YourFile", withExtension: "FileExtension")
и следующее было обновлено для учета записи файла:
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)
}
}
этот конкретный пример не самый гибкий, но с немного работы, вы можете легко передавать свои названия файла, расширения и значения данных.
пакеты доступны только для чтения. Вы можете использовать NSBundle.mainBundle().pathForResource
для доступа к файлу только для чтения, но для доступа на чтение и запись необходимо скопировать документ в папку Documents или tmp.