Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Expected behaviour with white space in the command line

I wrote a program that compiles my .cs files using csc.exe:

namespace myCompiler
{
    public partial class Form1 : Form
    {
        string compilerFolder;
        string outputFolder;
        string projectFile;
        string output = @" /out:";

        public Form1()
        {
            InitializeComponent();
        }

        private void startCompile_Click(object sender, EventArgs e)
        {
            Compile();
        }

        public void findCompile_Click(object sender, EventArgs e)
        {
            DialogResult result1 = folderBrowserDialog1.ShowDialog();
            compilerFolder = folderBrowserDialog1.SelectedPath;
            MessageBox.Show(compilerFolder);
            cscLabel.Text = compilerFolder;
        }

        private void outputCompile_Click(object sender, EventArgs e)
        {
            DialogResult result2 = folderBrowserDialog2.ShowDialog();
            outputFolder = folderBrowserDialog2.SelectedPath;
            outputLabel.Text = (outputFolder);
            MessageBox.Show(outputFolder);
        }

        private void findProject_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                projectFile = openFileDialog1.FileName;                
                projectLabel.Text = (projectFile);
                MessageBox.Show(projectFile);
            }
        }

        public void Compile()
        {
            try
            {
                Process compile = new Process();

                string outputExe = fileName.Text;
                string compiler = compilerFolder + @"\csc.exe";
                string arGs = output + outputFolder + @"\" + outputExe + " " + projectFile;

                compile.StartInfo.FileName = (compiler);
                compile.StartInfo.Arguments = (arGs);
                compile.StartInfo.RedirectStandardOutput = true;
                compile.StartInfo.UseShellExecute = false;
                compile.Start();

                string stdOutput = "";
                while (!compile.HasExited)
                {
                    stdOutput += compile.StandardOutput.ReadToEnd();
                    MessageBox.Show(stdOutput);
                }
            }

            catch (Exception errorMsg)
            {
                MessageBox.Show(errorMsg.Message);
            }
        }

        private void testButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show(projectFile);
            MessageBox.Show(compilerFolder);
        }   
    }
}

The compile instruction runs but produces no results, just a quick flash of a black console screen.

Basically what seems to be happening, is when all the strings are parsed in the commandline as arguments for the process, the .cs project source directory is broken up by each white space ie c:\users\%username%\Documents\Visual Studio 2010\ is broken up as c:\users\%username%\Documents\Visual then Studio then 2010\Projects\Myproject\myproj.cs

and subsequently the compilation fails.

like image 616
Jp Celliers Avatar asked Oct 22 '22 04:10

Jp Celliers


1 Answers

You need double quotes around a filepath with spaces in it.

See my edit to your code below.

public void Compile()
{
    try
    {
        Process compile = new Process();

        string outputExe = fileName.Text;
        string compiler = compilerFolder + "\csc.exe";

        // add double quotes around path with spaces in it.
        string arGs = output + "\"" + outputFolder + "\"" + @"\" + outputExe + " " + projectFile; 

        compile.StartInfo.FileName = compiler;
        compile.StartInfo.Arguments = arGs;
        compile.StartInfo.RedirectStandardOutput = true;
        compile.StartInfo.UseShellExecute = false;
        compile.Start();

        string stdOutput = "";
        while (!compile.HasExited)
        {
            stdOutput += compile.StandardOutput.ReadToEnd();
            MessageBox.Show(stdOutput);
        }
    }

    catch (Exception errorMsg)
    {
        MessageBox.Show(errorMsg.Message);
    }
}
like image 127
Sam Leach Avatar answered Oct 23 '22 18:10

Sam Leach