2010-12-11 1 views
2

私は呼び出しプロセスが終了しても、それ自身の後でクリーンアップする新しいプロセスを作成したいと思います。私はメモ帳を使用して、メモ帳を閉じた後に削除したい一時ファイルを表示する、以下の例を嘲笑しました。それ自身の後で常にクリーンアップするプロセスを作成することは可能ですか?

以下のコードでは、WaitForExit()行のコメントを解除するか、実行中の呼び出しプログラムを模倣するために無限ループに移行すると、期待通りに機能します。主な問題は、イベントがもはや処理されないため、呼び出し元のプログラムが終了したときです。

このケースを処理する方法についてお勧めします。

よろしく、

クリス

static void Main(string[] args) 
    { 
     string filename = @"c:\temp\example.txt"; 
     if (!File.Exists(filename)) 
      File.WriteAllText(filename, "abc"); 

     ProcessStartInfo psi = new ProcessStartInfo("notepad", filename); 

     Process cmdProcess = new Process(); 

     Process p = new Process(); 
     psi.CreateNoWindow = true; 
     p.EnableRaisingEvents = true; 
     p.StartInfo = psi; 
     p.Exited += (sender, e) => { File.Delete(filename); }; 

     p.Start(); 
     //p.WaitForExit(); 
    } 
+0

を**あなたが最後の行をコメントしなかった理由私は**理解していません。私はそれが呼び出し元のスレッド(すなわちあなたのプログラム)をブロックすることを知っていますが、それは正確に**あなたがしたいかもしれない** –

+0

私は呼び出し側のスレッド(私のプログラム)は、 。 – cristobalito

答えて

3

卑劣な方法は、約これを行うバッチファイルを書くことでしょう。サンプル(:\ TEST.BAT Cとして保存):ワーキング

echo FOO > c:\test.txt 
notepad c:\test.txt 
del c:\test.txt 
del c:\test.bat 
+0

ありがとうございますliho1eye - それは現在の解決策ですが、それは特定の優雅さを欠いています:) – cristobalito

+0

あなたは本質的に同じことを行う3番目の "モニタ"プロセスを作成することができます。あなたのソリューションは純粋にC#ですが、もう少しコードと複雑なプロジェクト/実行可能ファイルが追加されます。一番下の行は誰かがそれをやる(クリーンアップアクションを実行する)必要があり、あなたがそれを制御できないのでメモ帳ではできないということです。 –

+0

私はまだこの答えのハッキーに少し失望していますが、状況を考えればそれが可能なのはおそらく最高です。あなたの提案をありがとう。 – cristobalito

2

呼び出しプロセスが、それはもはや何もすることができます終了していない場合。それは存在しません。

ではなく、バックグラウンドスレッド(IsBackgroundをfalseに設定)という別のスレッドを作成し、そのスレッドでWaitForExitを呼び出すこともできます。 Mainからの通常の終了時にプロセスを生き残らせることになります。しかし、プロセスが異常終了した場合(タスクマネージャをkillするか、単に電源を抜く)、これは何もできません。あなたはFILE_FLAG_DELETE_ON_CLOSEでのWin32 FileCreateを使用して調査することがあり、特にファイルと

+0

ありがとうMarc - 面白い提案を私が調査します。異常終了に関しては、それは私が暮らすことができるものです。 – cristobalito

+0

これは、呼び出し元のプログラムが、作成したプロセスが終了するまで終了できないという問題です。新しいプロセスがこのクリーンアップを独自の方法で実行する方法はありますか? – cristobalito

0

からhttp://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx また、私はそうする.NET Frameworkの既存のサポートがないと思います。

notepad c:\temp\example.txt 
del c:\temp\example.txt 

、その後、あなたのプロセスではなく、バッチを実行します:

+0

ありがとうございましたAlexei - "親"プロセスでファイルを作成し、 "子"プロセスで完了したら削除します。 – cristobalito

関連する問題