Swift3 Data.write(to:)和filemanager.default.createFile之间的差异?

Swift3 Data.write(to:)和filemanager.default.createFile之间的差异?,swift3,ios10,Swift3,Ios10,编辑:重复部分中链接到的问题很好地回答了这个问题(我只是在发布这篇文章时没有找到它们)。请参考这些 我刚刚开始研究Swift(大约三、四天前),遇到了一个我真的不理解的问题,我找不到任何已经写过的东西。我已经看过了,并且从那里的公认答案中借用了一些代码,但是我仍然有一个问题要问 我在其他地方遇到了一些文件IO问题,所以为了进行实验并确保我理解了所有内容,我为iOS 10创建了一个全新的单视图应用程序来进行实验。我只在视图控制器中的viewDidLoad()函数中添加了以下内容(很抱歉,有点混乱)

编辑:重复部分中链接到的问题很好地回答了这个问题(我只是在发布这篇文章时没有找到它们)。请参考这些

我刚刚开始研究Swift(大约三、四天前),遇到了一个我真的不理解的问题,我找不到任何已经写过的东西。我已经看过了,并且从那里的公认答案中借用了一些代码,但是我仍然有一个问题要问

我在其他地方遇到了一些文件IO问题,所以为了进行实验并确保我理解了所有内容,我为iOS 10创建了一个全新的单视图应用程序来进行实验。我只在视图控制器中的viewDidLoad()函数中添加了以下内容(很抱歉,有点混乱):

然后我通过Xcode 8的模拟器运行它,并查看应用程序的文档文件夹。使用write()函数的行似乎工作正常。将创建一个名为hello.txt的.txt文件,然后用写出的数据重新填充该文件。但是createFile行似乎失败了,createdFile总是显示为false,并且目录中没有显示任何文件。它们之间的明显区别在于createFile行使用fURL.absoluteString,而不是URL-不幸的是,FileManager中似乎没有一个函数可以使用URL

当我尝试将absoluteString与其中一个写函数一起使用时,我收到一个错误,通知我它失败了,因为文件夹“hello.txt”不存在,这让我完全困惑,因为我不太明白代码认为它应该是一个目录,尤其是在使用isDirectory时


所以,很明显,我没有理解什么,也没有做错什么,但我看不出是什么。如果我想简单地创建一个文件以备将来写入,有人能解释一下正确的方法吗?我应该能够使用fileHandle方法,但另一种方法不起作用,这对我来说似乎很奇怪。

请参见此处,了解NSURLjust use
fURL.path的绝对字符串与路径的解释。区别在于,第一种方法以URL作为参数,第二种方法以文件路径作为参数。Strings以前没有找到这些参数,但他们正是我想要的。感谢Volker和Leo Dabus。请参见此处,以了解NSURLjust use
fURL.path
的绝对字符串与路径的解释。区别在于,第一个参数采用URL作为参数,第二个参数采用文件路径。Strings以前没有找到这些参数,但它们正是我想要的。谢谢沃克和利奥·达布斯。
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let mydata = "I like to eat food!".data(using: .utf8)
    let mydata2 = "Tigers are a man's best friend".data(using: .utf8)

    let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as URL
    let fURL = dir.appendingPathComponent("hello.txt", isDirectory: false)

    NSLog(fURL.absoluteString)

    do {
        if !FileManager.default.fileExists(atPath: fURL.absoluteString) {
            let createdFile = FileManager.default.createFile(atPath: fURL.absoluteString, contents: mydata2!, attributes: nil)
            NSLog("File created? \(createdFile)")
        }

        try "The other string!".write(to: fURL, atomically: true, encoding: .utf8)

        if !FileManager.default.fileExists(atPath: fURL.absoluteString) {
            let createdFile = FileManager.default.createFile(atPath: fURL.absoluteString, contents: mydata2, attributes: nil)
            NSLog("File created? \(createdFile)")
        }

        try mydata2?.write(to: fURL)

        let filehandle = try FileHandle.init(forWritingTo: fURL)
        filehandle.truncateFile(atOffset: 0)
        filehandle.write(mydata!)

    } catch {
        NSLog(error.localizedDescription)
    }
}