为什么运行可执行文件的C#代码不起作用?

时间:2014-05-04 01:29:04

标签: c# .net

我试图编写代码来检测USB驱动器并检查每个目录中的.exe文件。我成功地做到了这一点,但现在我想运行该exe文件。我无法做到这一点。为什么这段代码不起作用?

private void Form1_Load(object sender, EventArgs e)
{
        listremovable();
}

private void listremovable()
{

    foreach (DriveInfo d in DriveInfo.GetDrives())
    {
        if (d.IsReady && d.DriveType == DriveType.Removable)
            listBox1.Items.Add(d);

    }
    MessageBox.Show(drive.ToString());

    if (listBox1.Items.Count < 1)
    {
        MessageBox.Show("no usb");
    }

}

public void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    listBox2.Items.Clear();
    try
    {
        DriveInfo drive = (DriveInfo)listBox1.SelectedItem;
        foreach (DirectoryInfo dirinfo in drive.RootDirectory.GetDirectories())
            foreach (var file in dirinfo.GetFiles())
                if (file.Extension == ".exe")
                    listBox2.Items.Add(file);
        //MessageBox.Show(drive);

    }

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

public void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    string pro = listBox2.SelectedItem.ToString();
    //string hel = Directory.GetDirectories
    MessageBox.Show(pro);
    //System.Diagnostics.Process.Start(pro);
}

1 个答案:

答案 0 :(得分:7)

foreach (DirectoryInfo dirinfo in drive.RootDirectory.GetDirectories())
    foreach (var file in dirinfo.GetFiles())
        if (file.Extension == ".exe")
            listBox2.Items.Add(file);

好的,在这里您使用dirInfo DirectoryInfo的实例,并在其上调用GetFiles()GetFiles()返回FileInfo个对象的数组。然后,您浏览该数组,如果您喜欢所看到的内容,则将这些FileInfo对象添加到列表中。到目前为止一切都很好。

string pro = listBox2.SelectedItem.ToString();
//string hel = Directory.GetDirectories
MessageBox.Show(pro);
//System.Diagnostics.Process.Start(pro);

这是没有调试器的调试的沮丧结果,但看起来你试图这样做:

string pro = listBox2.SelectedItem.ToString();
System.Diagnostics.Process.Start(pro);

这是有道理的,但它显然不起作用。您从列表中获得的内容,前面提到的FileInfoProcess.Start期望的内容(文件或应用程序的路径)之间存在不匹配。你试过了,后一种方法引起了疯狂的抱怨。

这是你想做的事情:

// get your FileInfo object
// (SelectedItem gives you a plain object, but we know it's a FileInfo
// cause that's what you gave it before, so we cast it)
FileInfo fi = (FileInfo)listBox2.SelectedItem;

// grab a path to the file out of the object
string path = fi.FullName;

// pass that path to the Start method
System.Diagnostics.Process.Start(path);

有些事情可以帮到你们这里及以后:

  • 使用调试器。我看到有迹象表明你试图通过将它们打印到MessageBox来发现某些对象的值。这有效,但减慢了你的速度,并不总是可行的。了解如何使用Visual Studio的调试器。它易于使用,非常强大,并且会很快收回您的费用。
  • 使用文档。 MSDN的文档相当不错,有点稀疏,但他们会立即向您展示DirectoryInfo.GetFiles产生的内容以及Process.Start所期望的内容。