3

コマンドライン プログラムの GUI を作成しています。txtBoxUrls[TextBox] には、ファイル パスが 1 行ずつ入力されます。ファイル パスにスペースが含まれている場合、プログラムは正しく動作していません。プログラムを以下に示します。

string[] urls = txtBoxUrls.Text.ToString().Split(new char[] { '\n', '\r' });

string s1;
string text;
foreach (string s in urls)
{
    if (s.Contains(" "))
    {
        s1 = @"""" + s + @"""";
        text += s1 + " ";
    }
    else
    {
        text += s + " ";
    }
}


System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.CreateNoWindow = true;


proc.StartInfo.FileName = @"wk.exe";


proc.StartInfo.Arguments = text + " " + txtFileName.Text;

proc.StartInfo.UseShellExecute = false;


proc.StartInfo.RedirectStandardOutput = true;


proc.Start();

//Get program output
string strOutput = proc.StandardOutput.ReadToEnd();

//Wait for process to finish
proc.WaitForExit();

たとえば、txtBoxUrls に入力されたファイル パスが「C:\VS2008\Projects\web2pdf\web2pdf\bin\Release\Test Page.htm」の場合、プログラムは動作しません。二重引用符で囲まれたこのファイル パスは、Windows コマンド ライン (私は GUI を使用していません) で適切に機能します。解決策は何でしょうか。

4

3 に答える 3

10
proc.StartInfo.Arguments = text + " " + txtBoxUrls.Text + " " + txtFileName.Text; 

この行にtextは、txtBoxUrls 文字列の適切に引用されたバージョンが既に含まれています。+ txtBoxUrls.Text引用符なしの形式 ( )で再度追加するのはなぜですか? 私があなたのコードを正しく理解していれば、次のように動作するはずです:

proc.StartInfo.Arguments = text + " " + txtFileName.Text;    

実際、txtFileName.Textおそらくスペースが含まれている可能性があるため、念のためにそれも引用する必要があります。

proc.StartInfo.Arguments = text + " \"" + txtFileName.Text + "\"";    

(または、構文を使用して:)

proc.StartInfo.Arguments = text + @" """ + txtFileName.Text + @"""";    
于 2010-11-15T15:11:46.973 に答える
2

通常、ファイル名のスペースを回避するには、引数を二重引用符で囲む必要があります。引用符を省略すると、プログラムは 2 つの引数があると見なします。このようなもの...

wk.exe "C:\VS2008\Projects\web2pdf\web2pdf\bin\Release\Test Page.htm"

また、この行には引用符が多すぎるようです。3 つではなく 4 つ:

s1 = @"""" + s + @"""";
于 2010-11-15T15:11:00.240 に答える
0

Path クラスを見てください - http://msdn.microsoft.com/en-us/library/system.io.path.aspx

Path.combine が探しているものかもしれません。

于 2010-11-15T15:13:48.903 に答える