hdiutils
、有効なファイルへの正しいパスが与えられると、を返しますerror 2, no such file or directory
。コマンド配列のインデックスをと結合し" "
、それらを出力し、コピーして、ターミナルで正確な文字列を実行すると、正常に機能します。
これは、関連するビットのみを含むように編集された関数です。エラーを再現するには、にあるディスクイメージが必要~/Downloads/StarUML.dmg
です。
use std::env;
use std::fs;
use std::process::Command;
fn setup_downloads(download_name: &str) {
let downloads_path: String = {
if cfg!(unix) {
//these both yield options to unwrap
let path = env::home_dir().unwrap();
let mut downloads_path = path.to_str().unwrap().to_owned();
downloads_path += "/Downloads/";
downloads_path
} else {
"we currently only support Mac OS".to_string()
}
};
let files_in_downloads =
fs::read_dir(&downloads_path).expect("the read_dir that sets files_in_downloads broke");
let mut file_path: String = "None".to_string();
for file_name in files_in_downloads {
let file_name: String = file_name
.expect("the pre string result which sets file_name has broken")
.file_name()
.into_string()
.expect("the post string result which sets file_name has broken")
.to_owned();
if file_name.contains(&download_name) {
file_path = format!("'{}{}'", &downloads_path, &file_name);
}
}
let len = file_path.len();
if file_path[len - 4..len - 1] == "dmg".to_string() {
let mount_command = ["hdiutil", "mount"];
let output = Command::new(&mount_command[0])
.arg(&mount_command[1])
.arg(&file_path)
.output()
.expect("failed to execute mount cmd");
if output.status.success() {
println!(
"command successful, returns: {}",
String::from_utf8_lossy(&output.stderr).into_owned()
);
} else {
println!(
"command failed, returns: {}",
String::from_utf8_lossy(&output.stderr).into_owned()
);
}
}
}
fn main() {
setup_downloads(&"StarUML".to_string());
}
をCommand
変数に分割し、引数を指定した後、デバッグフォーマッタを使用して出力します。
let mut c = Command::new(&mount_command[0]);
c
.arg(&mount_command[1])
.arg(&file_path);
println!("{:?}", c);
この出力
"hdiutil" "mount" "\'/Users/shep/Downloads/StarUML.dmg\'"
Command
各引数の引用符は自動的に提供されますが、独自の単一引用符のセットが追加されていることに注意してください。
format!("'{}{}'", &downloads_path, &file_name);
// ^ ^
これらの一重引用符を削除します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加