std :: process :: CommandはmacOSでhdiutilを実行できません(マウントに失敗しました-そのようなファイルやディレクトリはありません)が、ターミナルで実行するとコマンドは正常に機能します

JA Kierstead

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

ダウンロードで正しいファイルが検出されたときにtrueと評価された場合

process :: Commandからのエラー応答

シェップマスター

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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ