2014-05-04 3 views
0

Я пытаюсь написать код для обнаружения USB-накопителя и проверить файлы .exe в каждом из его каталогов. Мне это удалось, но теперь я хочу запустить этот exe-файл. Я не могу этого сделать. Почему этот код не работает?Почему этот код C# для запуска исполняемых файлов не работает?

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); 
} 
+0

Пожалуйста, выделите конкретную часть кода, в которой вам нужна помощь. http://sscce.org – Luigi

ответ

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

Ok, здесь вы используете 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); 

Это имеет смысл, что this'd работы, но это, очевидно, не , Существует несоответствие между тем, что вы выбрали из своего списка, вышеупомянутым FileInfo, и то, что ожидает Process.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.
+1

Для перехода от 'object' к' FileInfo' требуется явное преобразование или ключевое слово 'as'. Отличное объяснение в целом. +1 –

+0

Спасибо, спасибо, @Ben. –

Смежные вопросы