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 游乐场和将文件写入文档的主要内容,如果未能解决你的问题,请参考以下文章