質問


ファイルをユーザーの一時フォルダーにダウンロードするアプリケーション(WinForms)があり、ユーザーがコンテンツを表示できるようにファイルを開き、ファイルが閉じられると、ファイルがTempフォルダーから削除されます。オープンしている場合は、アプリケーションがOKに動作します。1つの.pdfと1つの.docた場合は、別のWinwordプロセスがまだ実行されている場合、1つの.docを開こうとするときに問題が表示されます(アプリがアプリによって開くか、ユーザーが直接開くかは関係ありません) 。

次のコードを使用しています。

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

そして、これは温度をクリアするために

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

実行中のプロセスが自分のプロセスを停止しているようです。そして、停止することにより、ファイルが削除されるか、ファイルを削除しようとするときにエラーが生成されます。
何か提案はありますか?自分のプロセスを開くにはどうすればよいですか?問題は、私がどのファイルのタイプを開かなければならないかわからないことです(それは何でもかもしれません)、私は最適なアプリケーションを選択するためにWindowsを頼りにしています。私のテストから、メモ帳は大丈夫ですが、WinwordとAcrobatは私のプロセスを閉じます。
ありがとうございました

役に立ちましたか?

解決

Raymond ChenがWindowsシェルをやっていると説明しているのと同じように、MicrosoftWordがまったく同じことをしているのではないかと思います。 ここ:

顧客は、エクスプローラーウィンドウの生涯を監視するためのヘルプを望んでいました。

"Explorerのコピーを起動して特定のフォルダーを開き、ユーザーがフォルダーを閉じてから継続するまで待ちます。コマンドラインにフォルダーを備えたExplorerのコピーを起動してから、プロセスハンドルでWaitForsingleObjectを実行しましたが、待機せずに待機がすぐに完了することがあります。ユーザーがエクスプローラーウィンドウを閉じるまで、どうすれば待ちますか?"

これは、途中で問題を解決し、残りの半分に問題がある別のケースです。

その理由 Wait­For­Single­Object すぐに戻るのは、Explorerが単一インスタンスプログラム(まあ、限られたインスタンス)であるということです。 Explorerウィンドウを開くと、リクエストはExplorerの実行中のコピーに引き渡され、ExplorerのコピーはExitsを起動しました。それがあなたの理由です Wait­For­Single­Object すぐに戻ります。

あなたの場合、単語はすでに実行されているので、あなたが作成するとき 2番目 ワードプロセスとドキュメントを開くように指示すると、既に実行されている単語のインスタンスにリクエストを渡して、すぐに起動した2番目のプロセスを終了します。

「実行中のプロセスが自分のプロセスを止めている」と説明したとき、それはあなたが見ているものです。その2番目のインスタンスが起動後すぐに閉じられるため、 Exited イベントが発生し、コードがファイルを削除するように指示します!

あなたは、ノートパッド(WordやAdobe Acrobatとは異なり)が正常に機能することを顕著に観察します。これは、メモ帳が複数のインスタンスアプリケーションになるように設計されているためです。あなたはあなたが望むだけ多くのメモ帳のコピーを開くことができます。デスクトップですでに1つまたは6コピーが開いているかどうかは気にしません。さらに重要なことに、シェルにメモ帳でテキストドキュメントを開くように依頼すると、実際には 2番目 リクエストをに送信するのではなく、ノートパッドアプリケーションのコピー 最初 新しいドキュメントの新しいウィンドウを開くインスタンス。

他のヒント

process.startinfo.useshellexecuteを設定する必要があります true このような _OpenFileProces.StartInfo.UseShellExecute = true; プロセスを開始する前に、それが機能するはずだと思います...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top