Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在swift中通过命令行重建SQL数据库_Sql_Swift_Sqlite_Pipe_Command Line Arguments - Fatal编程技术网

在swift中通过命令行重建SQL数据库

在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”来

试图通过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)