在swift中通过命令行重建SQL数据库
试图通过Swift运行命令行参数非常困难。我需要对用户手动拖动到应用程序上的SQL文件运行命令(因此每次文件路径都不同) 我的应用程序和命令行之间的管道正在工作(发送'pwd'将返回正确的响应),但是当我尝试发送我想要的参数时,我无法让它们工作。我尝试过使用“bin/bash”和“usr/bin/env”,但都没有用 基本上,我正在尝试重建一个已损坏的数据库,而不必通过终端亲自进行。我在尝试中看到的常见错误包括“启动路径不可访问”或“未找到文件或目录”。我已经尝试通过终端使用“chmod 6”来设置文件的权限,但仍然不起作用。对于我在访问该文件时所做的错误,或尝试以其他方式重建数据库的任何帮助,我们将不胜感激在swift中通过命令行重建SQL数据库,sql,swift,sqlite,pipe,command-line-arguments,Sql,Swift,Sqlite,Pipe,Command Line Arguments,试图通过Swift运行命令行参数非常困难。我需要对用户手动拖动到应用程序上的SQL文件运行命令(因此每次文件路径都不同) 我的应用程序和命令行之间的管道正在工作(发送'pwd'将返回正确的响应),但是当我尝试发送我想要的参数时,我无法让它们工作。我尝试过使用“bin/bash”和“usr/bin/env”,但都没有用 基本上,我正在尝试重建一个已损坏的数据库,而不必通过终端亲自进行。我在尝试中看到的常见错误包括“启动路径不可访问”或“未找到文件或目录”。我已经尝试通过终端使用“chmod 6”来
func checkForCorruption(filePath: URL) -> (String?, Bool){
let folder = filePath.deletingLastPathComponent()
let arguments = ["cd \(folder.relativePath)", "sqlite3 Restaurant.sql", ".mode insert",".output dump.sql",".dump", ".exit"]
let task = Process()
task.launchPath = "bin/bash/"
task.arguments = arguments
let inPipe = Pipe()
task.standardInput = inPipe
let pipe = Pipe()
task.standardOutput = pipe
let errPipe = Pipe()
task.standardError = errPipe
var output : [String] = []
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let errData = errPipe.fileHandleForReading.readDataToEndOfFile()
if let out = NSString(data: data, encoding: String.Encoding.utf8.rawValue){
print(out)
}
if let errOut = NSString(data: errData, encoding: String.Encoding.utf8.rawValue){
print("error: \(errOut)")
}
let outHandle = pipe.fileHandleForReading
if var string = String(data: data, encoding: .utf8) {
string = string.trimmingCharacters(in: .newlines)
output = string.components(separatedBy: "\n")
do {
try string.write(toFile: "\(folder.relativePath)/dump.sql", atomically: true, encoding: String.Encoding.utf8)
}
catch _ {
print("something went wrong")
}
}
outHandle.readabilityHandler = { pipe in
print("reading")
if let line = String(data: pipe.availableData, encoding: String.Encoding.utf8) {
print("New ouput: \(line)")
} else {
print("Error decoding data: \(pipe.availableData)")
}
}
return ("", false)
}
我在工作中得到了一些帮助,对于任何与此相关的人,这里是答案(print语句就是转储文件所在的位置)
let arguments = ["\(filePath.relativePath)", ".mode insert",".output dump.sql",".dump", ".exit"]
let task = Process()
task.launchPath = "/usr/bin/sqlite3"
print(FileManager.default.currentDirectoryPath)