我正在尝试使用以下代码将文件从我的软件包复制到iOS中的文档目录。
let bundlePath = NSBundle.mainBundle().pathForResource("information", ofType: ".png")
print(bundlePath, "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
let fileManager = NSFileManager.defaultManager()
let fullDestPath = NSURL(fileURLWithPath: destPath).URLByAppendingPathComponent("information.png")
let fullDestPathString = String(fullDestPath)
print(fileManager.fileExistsAtPath(bundlePath!)) // prints true
do{
try fileManager.copyItemAtPath(bundlePath!, toPath: fullDestPathString)
}catch{
print("\n")
print(error)
}
错误域= NSCocoaErrorDomain代码= 4"文件“information.png”不存在。" UserInfo = {NSSourceFilePathErrorKey = / Users / macbookpro / Library / Developer / CoreSimulator / Devices / E58CA1C6-C6F1-4D72-9572-3925675E78A5 / data / Containers / Bundle / Application / EFA83E02-5F24-4BB3-B32A-7E755081A730 / AutoLayout tuts.app /information.png,NSUserStringVariant =( 复制 ),NSDestinationFilePath = file:/// Users / macbookpro / Library / Developer / CoreSimulator / Devices / E58CA1C6-C6F1-4D72-9572-3925675E78A5 / data / Containers / Data / Application / 86A1BDD5-FAF2-486E-85A9-CF72A547C6CD / Documents /information.png,NSFilePath = / Users / macbookpro / Library / Developer / CoreSimulator / Devices / E58CA1C6-C6F1-4D72-9572-3925675E78A5 / data / Containers / Bundle / Application / EFA83E02-5F24-4BB3-B32A-7E755081A730 / AutoLayout tuts .app / information.png,NSUnderlyingError = 0x7fb53251cd80 {错误域= NSPOSIXErrorDomain代码= 2"没有这样的文件或目录"}}
根据fileManager.fileExistsAtPath()
文件确实存在。我做错了什么?
答案 0 :(得分:14)
问题在于这一行:
let fullDestPathString = String(fullDestPath)
应该是:
let fullDestPathString = fullDestPath.path
查看错误。问题是目的地。请注意file:///
。您的代码未正确将URL转换为文件路径。您需要使用path
的{{1}}属性将路径作为字符串。
在所有调试和检查中,您从未验证过NSURL
。
答案 1 :(得分:4)
Swift 3
func copyfileToDocs()
{
let bundlePath = Bundle.main.path(forResource: "db", ofType: ".sqlite")
print(bundlePath!, "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let fileManager = FileManager.default
let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("db.sqlite")
let fullDestPathString = fullDestPath?.path
print(fileManager.fileExists(atPath: bundlePath!)) // prints true
do
{
try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString!)
print("DB Copied")
}
catch
{
print("\n")
print(error)
}
}
答案 2 :(得分:4)
在某些答案中误导:
print(fileManager.fileExists(atPath:bundlePath!))
因此提出了这个package de.scrum_master.stackoverflow
import groovy.util.logging.Slf4j
import org.junit.Rule
import org.slf4j.Logger
import spock.lang.Specification
@Slf4j
class LombokSlf4jLogTest extends Specification {
def logger = Spy(new LoggerDelegate(originalLogger: log))
@Rule
ReplaceSlf4jLogger replaceSlf4jLogger = new ReplaceSlf4jLogger(Clazz, logger)
def "warning is logged"() {
when: "when calling the method"
new Clazz().method()
then: "a warning is logged"
1 * logger.warn(*_)
true
}
static class LoggerDelegate {
@Delegate Logger originalLogger
}
}
版本:
extension
<强>用法强>
extension FileManager {
func copyfileToUserDocumentDirectory(forResource name: String,
ofType ext: String) throws
{
if let bundlePath = Bundle.main.path(forResource: name, ofType: ext),
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
.userDomainMask,
true).first {
let fileName = "\(name).\(ext)"
let fullDestPath = URL(fileURLWithPath: destPath)
.appendingPathComponent(fileName)
let fullDestPathString = fullDestPath.path
if !self.fileExists(atPath: fullDestPathString) {
try self.copyItem(atPath: bundlePath, toPath: fullDestPathString)
}
}
}
}
答案 3 :(得分:3)
请查找Code Below.i参考了@ rmaddy的回答。
func CheckDataBaseOnPathorNot() -> Void {
let bundlePath = Bundle.main.path(forResource: "Project_Expert", ofType: ".db")
print(bundlePath ?? "", "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let fileManager = FileManager.default
let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("Project_Expert.db")
let fullDestPathString = fullDestPath!.path
print(fileManager.fileExists(atPath: bundlePath!)) // prints true
if fileManager.fileExists(atPath: fullDestPathString) {
print("File is available")
}else{
do{
try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString)
}catch{
print("\n")
print(error)
}
}
}
检查此代码是否该路径上的文件不可用,然后复制该文件。
谢谢。
答案 4 :(得分:0)
获取你应该使用的字符串路径
let path = fullDestPath.path
旁注
fileManager.fileExistsAtPath(bundlePath!) == true
是检查值是否为真的方法
fileManager.fileExistsAtPath(bundlePath!)
这可能会有一些问题