2017-06-22 7 views
0

Swiftからコマンドライン引数を実行しようとするのは非常に困難です。ユーザーが手動でアプリケーションにドラッグするSQLファイルでコマンドを実行する必要があります(ファイルのパスが毎回異なるため)。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) 
} 

答えて

0

私は仕事でいくつかの助けを得、これに苦しんで、誰のために、ここでの答えは(print文は、ダンプ・ファイルが置かれているだけあっている)です。

let arguments = ["\(filePath.relativePath)", ".mode insert",".output dump.sql",".dump", ".exit"] 
    let task = Process() 
    task.launchPath = "/usr/bin/sqlite3" 
    print(FileManager.default.currentDirectoryPath) 
関連する問題