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)
}