3

新しいファイルのフォルダーを監視し、プロセスを実行する Windows サービスがあります。ただし、ファイルを監視対象フォルダーにドロップするたびに、サービスがクラッシュします。これが私が受け取っている例外です:

アプリケーション: フレームワーク バージョン: v4.0.30319 説明: 未処理の例外が発生したため、プロセスが終了しました。例外情報: System.IO.IOException スタック: System.IO._ Error.WinIOError(Int32, System.String) at System.IO. Service.Service.OnChanged(System.Object, System. IO.FileSystemEventArgs) で System.IO.FileSystemWatcher.OnCreated (System.IO.FileSystemEventArgs)
System.IO.FileSystemWatcher.NotifyFileSystemEventArgs (Int32、System.String) で System.IO.FileSystemWatcher.CompletionStatusChanged (UInt32、UInt32、System.Threading.NativeOverlapped*) で System.Threading._IOCompletionCallback.PerformIOCompletionCallback (UInt32、UInt32、System. Threading.NativeOverlapped*)

すべてが正常に機能していたのに、突然、使用するたびにクラッシュします。これを引き起こす何かを変更したことを覚えていません。これが私のコードです:

public Service()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    FileSystemWatcher watcher = new FileSystemWatcher(ConfigurationManager.AppSettings["UploadPath"]);

    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.EnableRaisingEvents = true;
}

public static void OnChanged(object source, FileSystemEventArgs e)
{
    Process(e.Name, e.FullPath);
}

public static void Process(string fileName, string path)
{
    string newPath = Path.Combine(ConfigurationManager.AppSettings["NewPath"], fileName);

    Process process = new Process();

    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.FileName = @"C:\Program Files\Microsoft Security Client\Antimalware\mpcmdrun";
    process.StartInfo.Arguments = " -scan -scantype 3 -file L:\\Test\\";

    process.Start();

    string output = process.StandardOutput.ReadToEnd();
    process.WaitForExit();

    if (process.ExitCode == 0)
    {
        File.Move(path, cleanPath);
    }

    else
    {
        TextWriter tw = new StreamWriter(ConfigurationManager.AppSettings["FailedPath"] + fileName + ".txt");
        tw.WriteLine(output);
        tw.Close();

        File.Delete(path);
    }
}
protected override void OnStop()
{

}
4

5 に答える 5

1

別のプロセス、たとえば手動で起動しているスキャナーの別のインスタンスが、ファイルを移動しようとしたときにファイルのロックを保持している可能性がありますか?

プロセスモニターを使用して、ファイルにアクセスしているプロセスを確認する必要があります。

とにかく、新しいファイルをスキャンするのではなく、常にフォルダーL:\Test全体をスキャンします。それはあなたの意図ですか?

于 2011-09-02T13:44:49.967 に答える
1

場合によっては、プロセスがまだファイルをロックしていると思われます。不思議に思っているのですが、なぜあなたは電話をかけないのですか?

process.Close(); // Frees all the resources that are associated with this component

WaitForExit() の後。

于 2011-08-31T17:34:58.350 に答える
0

このように、プロセスが0で存在することを確認した直後に、次のチェックを行わないでください。

if (process.ExitCode == 0)
{
    process.Close();
    process.Dispose();
    if (File.Exists(path+filename) && !IsFileLocked(fileInfo) && Directory.Exists(cleanPath))
        File.Move(path, cleanPath);
}

移動しようとしている間、スキャン プロセスがまだファイルを隔離しているかどうかは疑問です。

参照:ファイルがロックされていることを確認する方法を知っていますか?

そしてもちろん、else 条件を適切に処理する必要があります...

于 2011-08-31T18:08:11.797 に答える
0

プロセスの作成前に Thread.Sleep(5000) を追加しました。これはうまく機能しますが、各ファイルのスキャンに 5 秒かかります。そして、人々が人々に言ったように、それは一種のハックのように感じます.

于 2011-09-02T13:38:29.653 に答える
0

MpCmdRun を使用する際に必要と思われる 2 つのトリック:

  1. -DisableRemediationを呼び出すときにパラメータのリストに含めますMpCmdRun。これにより、プロセスが非常に迅速に実行され、 を介して結果が報告されますStandardOutput

  2. 返された終了コードを無視します。代わりに、返された StandardOutput 文字列を"found no threats"調べて、ファイルがクリーンかどうかを確認してください。そこにない場合は、で始まる行を探して"Threat"読んで、見つかったウイルスを確認します。

于 2020-02-26T23:26:14.643 に答える