web-dev-qa-db-ja.com

フォルダーにスペースが含まれている場合、ファイルパス内のスペースを処理する方法

public static void launchProcess(string processName, string arguments, out string output)
{
    Process p = new Process
    {
        StartInfo = { UseShellExecute = false, RedirectStandardOutput = true, FileName = processName, Arguments = arguments }
    };

    p.Start();
    output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

}

そして、私の引数に次のようなファイル名が含まれている場合:

D:\Visual Studio Projects\ProjectOnTFS\ProjectOnTFS

次に、エラーが発生します。

9
vakas

二重引用符が必要ですが、文字列Word-for-Word( 逐語的文字列 )を処理するために@も必要になる可能性があります。つまり、「\」は文字列で特別な意味を持ちます。\tはタブを意味するので、\を無視します

したがって、二重引用符だけでなく、@

string myArgument = @"D:\Visual Studio Projects\ProjectOnTFS\ProjectOnTFS";
13
Alex KeySmith

ほとんどのアプリで(必要に応じて)以下を使用して、空白がある場合は文字列の最初と最後に二重引用符を追加します。

public string AddQuotesIfRequired(string path)
{
    return !string.IsNullOrWhiteSpace(path) ? 
        path.Contains(" ") && (!path.StartsWith("\"") && !path.EndsWith("\"")) ? 
            "\"" + path + "\"" : path : 
            string.Empty;
}

例..

AddQuotesIfRequired(@"D:\Visual Studio Projects\ProjectOnTFS\ProjectOnTFS");

戻り値 "D:\Visual Studio Projects\ProjectOnTFS\ProjectOnTFS"

AddQuotesIfRequired(@"C:\Test");

戻り値 C:\Test

AddQuotesIfRequired(@"""C:\Test Test\Wrap""");

戻り値 "C:\Test Test\Wrap"

AddQuotesIfRequired(" ");

空の文字列を返します

AddQuotesIfRequired(null);

空の文字列を返します

[〜#〜]編集[〜#〜]

提案に従って、関数の名前を変更し、null参照チェックも追加しました。

重複しないように、文字列の最初と最後に二重引用符がすでに存在するかどうかを確認するチェックを追加しました。

文字列チェック関数をIsNullOrWhiteSpaceに変更して、空白と空またはnullをチェックし、空白またはnullの場合は、空の文字列を返します。

5
Master Mick

これは古いスレッドだと思いますが、私の後にこれを見る人は、次のこともできます。

string myArgument="D:\\Visual Studio Projects\\ProjectOnTFS\\ProjectOnTFS"

バックスラッシュをエスケープすることにより、@記号を使用する必要はありません。ちょうど別の選択肢。

2
Greg H-R