2016-06-17 12 views
0

コマンドライン "XVirus.Start();" "System.InvalidOperationExceptionがスローされました:ファイル名が指定されていないため、プロセスを開始できません。" それが起こる前に、それはまったく問題なく私のプログラムを始めました。コードは起こった前後でも同じです。必要な場合はここに私のコードです。C#System.InvalidOperationExceptionがスローされました:ファイル名が提供されていないため、プロセスを開始できません。

using System; 
using System.Diagnostics; 
using System.IO; 

namespace FDVirusX 
{ 
    class MainClass 
{ 
    public static void Main(string[] args) 
    { 
     var XVirus = new Process(); 

     var driveList = DriveInfo.GetDrives(); 

     foreach (DriveInfo drive in driveList) 
     { 
      if (drive.DriveType == DriveType.Removable) 
      { 
       Console.WriteLine("Scanning Flash Drive: " + drive.Name + drive.VolumeLabel); 

       System.Threading.Thread.Sleep(1900); 

       if (Directory.GetFiles(drive.ToString(), "*.lnk", SearchOption.AllDirectories).Length == 0) 
       { 
        XVirus.StartInfo.WorkingDirectory = drive.ToString(); 
        XVirus.StartInfo.FileName = "cmd.exe"; 
        XVirus.StartInfo.Arguments = " /c title FDVirusX & cls & @echo off & echo There are no shortcut viruses in this Flash Drive."; 
        XVirus.StartInfo.UseShellExecute = false; 
        XVirus.StartInfo.RedirectStandardOutput = true; 
       } 
       else 
       { 
        XVirus.StartInfo.WorkingDirectory = drive.ToString(); 
        XVirus.StartInfo.FileName = "cmd.exe"; 
        XVirus.StartInfo.Arguments = "/c title FDVirusX & cls & attrib -s -h -r /s /d & echo Files restored. & del /f /s *.lnk & echo Shortcut files deleted."; 
        XVirus.StartInfo.UseShellExecute = false; 
        XVirus.StartInfo.RedirectStandardOutput = true; 
       } 
       if (!Directory.Exists(drive.ToString())) 
       { 
        XVirus.StartInfo.WorkingDirectory = @"C:/"; 
        XVirus.StartInfo.FileName = "cmd.exe"; 
        XVirus.StartInfo.Arguments = "/c title FDVirusX & cls & @echo off & echo Flash Drive not found."; 
        XVirus.StartInfo.UseShellExecute = false; 
        XVirus.StartInfo.RedirectStandardOutput = true; 
       } 
      } 
     } 
     XVirus.Start(); // System.InvalidOperationException has been thrown: Cannot start process because a file name has not been provided. 
     Console.WriteLine(XVirus.StandardOutput.ReadToEnd()); 
     System.Threading.Thread.Sleep(2000); 
     Console.WriteLine("Closing Application..."); 
     System.Threading.Thread.Sleep(3000); 
     XVirus.WaitForExit(); 
     XVirus.Close(); 
    } 
} 

}

+1

リムーバブルドライブを準備していない場合はどうなりますか? – Steve

+0

ところで、CMD.EXEによって実行されるべき実行可能ファイル名は何ですか?最初の引数としてのタイトルは、exe名でなければなりません。 – Steve

+0

「フラッシュドライブが見つかりません」と表示されます – Jeff0945

答えて

1

いずれかのこのdriveList空です:

var driveList = DriveInfo.GetDrives(); 

またはNoneは取り外し可能です:

if (drive.DriveType == DriveType.Removable) 

いくつかの簡単なデバッグは、問題を確立します。

+0

「フラッシュドライブが見つかりません」と表示されるはずです。私は私のフラッシュドライブでコードをもう一度テストし、すべてが正常に機能しました。しかし、問題は「フラッシュドライブが見つかりません」です。エラーになります。 – Jeff0945

1

処理できるリムーバブルドライブがあるかどうかを確認する必要があります。 XVirus変数を初期化するのは、GetDrivesメソッドがリムーバブルドライブを返す場合のみです。あなたは、あなたがforeachループ内のドライブを処理するコードを移動する必要があり、複数のドライブを処理したい場合にも

public static void Main(string[] args) 
{ 
    // Be explicit and keep it initialized as null, so you could 
    // check it at the end of the loop if there are drives to process 
    Process XVirus = null; 

    // We are interested only in the removable drives. 
    // Linq is good choice here 
    foreach (DriveInfo drive in DriveInfo.GetDrives() 
         .Where(x => x.DriveType == DriveType.Removable && 
            x.IsReady) 
    { 
     XVirus = new Process(); 

     ..... initialize the XVirus operating parameters ... 

     // and remove this block because is not needed now 
     // if (!Directory.Exists(drive.ToString())) 
     // { 
     //  ... 
     // } 
    } 

    // At the end if XVirus is still null we know that 
    // no removable drives are available 
    if(XVirus == null) 
     MessageBox.Show("You don't have any removable drive ready") 
    else 
     ..... process the found drive .... 
} 

+0

申し訳ありませんが、リムーバブルドライブがない場合でも(XVirus == null)の行はまだ動作しません。 – Jeff0945

+0

私は、IsReady – Steve

+0

のチェックを追加する必要があります。この種の操作は常に失敗する可能性があることに注意してください。ドライブに取り組んでいる間に手動でドライブを取り外すことをユーザーに拒否することはできないので、このコードの周りにはtry/catchを使用したロバストなトラップトラップが必要です – Steve

1

私がラインを必要としないように思える

    if (!Directory.Exists(drive.ToString())) 
       { 
        XVirus.StartInfo.WorkingDirectory = @"C:/"; 
        XVirus.StartInfo.FileName = "cmd.exe"; 
        XVirus.StartInfo.Arguments = "/c title FDVirusX & cls & @echo off & echo Flash Drive not found."; 
        XVirus.StartInfo.UseShellExecute = false; 
        XVirus.StartInfo.RedirectStandardOutput = true; 
       } 

私のコードの問題を解決するのを助けてくださった皆様、ありがとうございます。

関連する問題