C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VB.NET プログラムからのプロセス終了とファイル削除

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■83317 / inTopicNo.1)  VB.NET プログラムからのプロセス終了とファイル削除
  
□投稿者/ おん (1回)-(2017/03/17(Fri) 09:34:42)

分類:[VB.NET/VB2005 以降] 

プログラム終了時に特定のExcelファイルを削除する処理を組んだのですが、
削除対象のファイルを開いているとエラーになるため、
最初に対象ファイルのプロセスを終了する処理を入れました。

しかし、Excelは1つのプロセスで複数のファイルを持っていて、
最全面に表示されているファイルしか個別のプロセス終了ができないようで、
対象ファイルのプロセスを終了できず、削除時にエラーになってしまう場合があります。

p.Kill()では関係のないファイルまでプロセス終了してしまうので、
対象のファイルがMainWindowでない場合にも、
ピンポイントで対象ファイルのみをプロセス終了することはできますでしょうか?

ご教授の程、よろしくお願いします。



以下が今回組んだプログラムです。

Dim fileName as String = "C:\hoge.xls"
Dim fInfo As System.IO.FileInfo = New System.IO.FileInfo(fileName)

For Each p As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses()
If p.MainWindowTitle.Contains(System.IO.Path.GetFileName(fileName)) = True Then
p.CloseMainWindow()
End If
Next

fInfo.Delete()
引用返信 編集キー/
■83319 / inTopicNo.2)  Re[1]: VB.NET プログラムからのプロセス終了とファイル削除
□投稿者/ 魔界の仮面弁士 (1197回)-(2017/03/17(Fri) 10:39:09)
No83317 (おん さん) に返信
> 最初に対象ファイルのプロセスを終了する処理を入れました。

プロセスごと終了させずとも、開いているブックだけ閉じてもらえば
良いと思うのですが、それでは駄目でしょうか。たとえばこんな感じ。

Dim oBook As Object = Nothing
Try
  oBook = GetObject(strExcelBookPath)
  CallByName(oBook, "Close", CallType.Method, False)
Catch ex As Exception

Finally
  If oBook IsNot Nothing Then
    Marshal.ReleaseComObject(oBook)
  End If
End Try
System.IO.File.Delete(strExcelBookPath)


GetObject により、既に開かれている Excel.Workbook オブジェクトのインスタンスを
取得できるため、それを oBook.Close(False) メソッドで閉じるという処理です。

ただし該当ファイルが開かれていなかった場合には、GetObject によって
無駄に開かれてしまうことになるのが欠点にもなります。

無駄に開くことでパフォーマンス上の問題が生じる場合は、
開いているワークブックのパスの一覧を調査するために、
GetRunningObjectTable API を用いて、
System.Runtime.InteropServices.ComTypes.IRunningObjectTable から
既存の Excel インタンスを列挙してみるという手法があります。
あるいは手抜き実装として、とにかく削除してみて、それがエラーになったら
GetObject & Close を行ってから再削除してみるという力技とか。


ただ、該当ブックが直接開かれているのではなく、他のワークシート上から
"=SUM([Budget.xlsx]Annual!C10:C25)"
のようにワークシート関数で参照されているケースもありえますし、
Microsoft Excel 以外のソフトウェア、たとえば Excel ODBC Driver や
アンチウィルスソフトの検閲動作などによって開かれている可能性も
あるかも知れませんね。そこまで対処するのは実装コストが跳ね上がりそうですが…。
引用返信 編集キー/
■83398 / inTopicNo.3)  Re[2]: VB.NET プログラムからのプロセス終了とファイル削除
□投稿者/ おん (2回)-(2017/03/21(Tue) 09:08:08)
No83319 (魔界の仮面弁士 さん) に返信

教えて頂いた方法で消したいファイルをピンポイントで削除することができました。
ありがとうございます!

プロセスを終了することに拘ってしまっていましたが、
そんなことを考えなくても良かったのですね・・・
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ