快速读取文件,iOS操场
通过search许多(许多!)快速的操场问题甚至制作这个代码,我仍然在挣扎。
我在包内容的Resources
文件夹中放置了一个文本文件,它在运行库( /var/folders/ ...
)生成的运行临时文件中显示为别名(链接)。
import UIKit let bundle = NSBundle.mainBundle() let myFilePath = bundle.pathForResource("dict1", ofType: "txt") println(myFilePath) // <-- this is correct, there is a shortcut to the Resource file at this location var error:NSError? var content = String(contentsOfFile:myFilePath!, encoding:NSUTF8StringEncoding, error: &error) println(content!) // <-- this is *NOT* the file contents [EDIT: see later note] // Demonstrate there's no error if let theError = error { print("\(theError.localizedDescription)") } else { print("No error") }
问题在于,在操场输出中显示的content
是Some "apple\ngame\nhow\nswift\ntoken"
,而不是按预期方式显示的文件内容。
它find的文件,因为如果我改变文件名,它的错误。 有关获取文件内容的任何build议?
Xcode 6.1
编辑:所以, 实际的问题是,我不期望的操场输出(包括println
)被转义。 加上疲劳和其他愚蠢,我相信当没有人存在的时候,就会有问题。
有趣的是,并非所有的东西在操场上都能逃脱:
println("foo\nbar") // Outputs "foo\nbar", escaped println("\\n") // Outputs "\n", unescaped
您可以尝试创build一个打开和保存文件的类:
更新: Xcode 7.2•Swift 2.1.1
class File { class func open(path: String, encoding: NSStringEncoding = NSUTF8StringEncoding) -> String? { if NSFileManager().fileExistsAtPath(path) { do { return try String(contentsOfFile: path, encoding: encoding) } catch let error as NSError { print(error.code) return nil } } return nil } class func save(path: String, _ content: String, encoding: NSStringEncoding = NSUTF8StringEncoding) -> Bool { do { try content.writeToFile(path, atomically: true, encoding: encoding) return true } catch let error as NSError { print(error.code) return false } } }
用法:File.save
let stringToSave:String = "Your text" let didSave = File.save("\(NSHomeDirectory())/Desktop/file.txt", stringToSave) if didSave { println("file saved") } else { println("error saving file") }
用法:File.open
if let loadedData = File.open("\(NSHomeDirectory())/Desktop/file.txt") { println(loadedData) } else { println("error reading file") }
如果您喜欢使用url(与我一样并由Apple推荐):
class Url { class func open(url: NSURL) -> String? { do { return try String(contentsOfURL: url, encoding: NSUTF8StringEncoding) } catch let error as NSError { print(error.code) return nil } } class func save(urL: NSURL, fileContent: String) -> Bool { do { try fileContent.writeToURL(urL, atomically: true, encoding: NSUTF8StringEncoding) return true } catch let error as NSError { print(error.code) return false } } }
我已经看到了使用TextEdit从.rtf文件创build的.txt文件的这个问题。
我在我的游乐场的资源文件夹中使用类似的代码加载了一个text.txt文件。 文件内容是“hello there”,通过改变扩展名将.rtf文件转换为.txt。
let path = NSBundle.mainBundle().pathForResource("text", ofType: "txt")//or rtf for an rtf file var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)! println(text)
输出是:
{\ rtf1 \ ansi \ ansicpg1252 \ cocoartf1343 \ cocoasubrtf140 {\ fonttbl \ f0 \ fswiss \ fcharset0 Helvetica;} {\ colortbl; \ red255 \ green255 \ blue255;} \ margl1440 \ margr1440 \ vieww10800 \ viewh8400 \ viewkind0 \ pard \ tx720 \ tx1440 \ tx2160 \ tx2880 \ tx3600 \ tx4320 \ tx5040 \ tx5760 \ tx6480 \ tx7200 \ tx7920 \ tx8640 \ pardirnatural
\ f0 \ fs24 \ cf0 hello there}
所以“你好”是embedded式的。 这是一个.rtf文件中的所有布局信息的问题。
我回到了TextEdit并创build了一个真正的.txt文件。 打开文件后 – 格式化|制作纯文本
现在这个相同的代码给了控制台输出“你好”。
希望这可以帮助。