xCode 游乐场和将文件写入文档

Posted

技术标签:

【中文标题】xCode 游乐场和将文件写入文档【英文标题】:xCode playground and writing files to Documents 【发布时间】:2016-12-22 19:09:34 【问题描述】:

我正在尝试通过 XCode 的游乐场测试一些 sqlite 数据库调用。我从 Playground 的 Resources 文件夹中的一个数据库开始,并尝试将其移动到 Playgrounds Documents 文件夹,但是发生的情况是生成了一个指向 Resources 文件夹中文件的符号链接,因此我无法写入该文件。但是,如果我知道 Documents 文件夹在哪里,然后从终端手动将文件复制到那里,那么一切正常。

那么为什么文件管理器的复制命令实际上是创建一个符号链接而不是复制呢?有没有办法真正做到这一点?这似乎只是游乐场的问题。从 Resource 复制到 Documents 在应用程序本身中运行良好。

一些要在操场内测试的代码...

let dirPaths =     NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true)
let docsDir = dirPaths[0]
let destPath = (docsDir as NSString).appendingPathComponent("/data.sqlite")
print(destPath)

let fileMgr = FileManager.default


let srcPath = Bundle.main.path(forResource: "data", ofType:"sqlite")
// This copies the data.sqlite file from Resources to Documents
//    ** However in the playground, only a symlink is generated
do 
    try fileMgr.copyItem(atPath: srcPath!, toPath: destPath)
 catch let error 
    print("Error (during copy): \(error.localizedDescription)")

【问题讨论】:

【参考方案1】:

Rod,为时已晚,但我想通了。

上下文:

我在同一个工作区的项目中添加了一个 Playground 为了让 Playground 与我的项目配合使用,我创建了一个框架 我将 Store.db 文件添加到框架目标中 我没有将 Store.db 作为资源添加到 Playground 斯威夫特 3

游乐场

@testable import MyAppAsFramework

func copyMockDBToDocumentsFolder(dbPath: String) 
    let localDBName = "Store.db"
    let documentPath = dbPath / localDBName
    let dbFile = Bundle(for: MyAppAsFrameworkSomeClass.self).path(forResource: localDBName.deletingPathExtension, ofType: localDBName.pathExtension)

    FileManager.copyFile(dbFile, toFolderPath: documentPath)


copyMockDBToDocumentsFolder(dbPath: "The documents path")

/ copyFile(x) 之类的东西是运算符重载和扩展

extension String 

    public var pathExtension: String 
        get 
            return (self as NSString).pathExtension
        
    

    public var deletingPathExtension: String 
        get 
            return (self as NSString).deletingPathExtension
        
    

    public func appendingPath(_ path: String) -> String 
        let nsSt = self as NSString
        return nsSt.appendingPathComponent(path)
    




infix operator / : MultiplicationPrecedence

public func / (left: String, right: String) -> String 
    return left.appendingPath(right)



extension FileManager  

    class func copyFile(_ filePath: String?, toFolderPath: String?) -> Bool 

        guard let file = filePath else  return false 
        guard let toFolder = toFolderPath else  return false 

        var posibleError: NSError?

        do 
            try FileManager.default.copyItem(atPath: file, toPath:toFolder)
         catch let error as NSError 
            posibleError = error
            print("CAN'T COPY \(error.localizedDescription)")
        

        return posibleError == nil
    


【讨论】:

以上是关于xCode 游乐场和将文件写入文档的主要内容,如果未能解决你的问题,请参考以下文章

13-Groovy-读取内容和写入文件

写入文件 Xcode MacOS

如何将图像写入文件?

写入 XCode 项目目录中的文件

Unicode (UTF-8) 在 Python 中读取和写入文件

如何“在 Xcode 中将本章作为游乐场打开”?