

Excelがファイルの編集を終えたことを検知したいのですが、Excelプロセスの終了検知も、開いているファイルのリード権をポーリングする方法でも誤検知してしまいます。  
確実に編集を終えたことを検知する方法はないのでしょうか。

今のところ想像ですが、  
<https://support.microsoft.com/en-us/kb/981094/ja>  
の現象で、excelが上書き保存のタイミングでxlsxファイルを一度手離す気がしています。

コードですが以下のような感じで、終了監視しています。

[code]

    System.Diagnostics.Process p = System.Diagnostics.Process.Start(filename);
    if (p != null)
    {
       p.WaitForExit();
       while (System.IO.File.Exists(filename))
       {
           System.Threading.Thread.Sleep(1000);
           try
           {
               using (System.IO.FileStream fs =
                   new System.IO.FileStream(
                       filename,
                       System.IO.FileMode.Open,
                       System.IO.FileAccess.Read,
                       System.IO.FileShare.None))
               {
                   break;
               }
           }
           catch
           {
               continue;
           }
       }
    }
    else
    {
       while (System.IO.File.Exists(filename))
       {
           System.Threading.Thread.Sleep(1000);
           try
           {
               using (System.IO.FileStream fs =
                   new System.IO.FileStream(
                       filename,
                       System.IO.FileMode.Open,
                       System.IO.FileAccess.Read,
                       System.IO.FileShare.None))
               {
                   break;
               }
           }
           catch
           {
               continue;
           }
       }
    }
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2015-04-21T00:20:47.203
9359
2015-04-22T09:54:26.003
2015-04-21T08:26:05.200
8000
2266
question
c# windows excel
Excelがファイルを使用していることを検知する方法


言語が特定されていませんが。  
EXCELしかタグがないのでEXCEL-VBA(ポーリングは…OnTime処理かな?)の前提で話しますね。

「開いているファイルのリード権」を確認というのは、`.ReadOnly`の判別方法でしょうか？

マイクロソフトのサポートのサンプルコードでは、  
`Open filename For Input Lock Read as`で実際にロックかけて確認しています。  
<https://support2.microsoft.com/default.aspx?scid=kb%3Bja%3B291295>

こちらは試してみましたか？  
またVBAかどうかも分からないので。VBA以外であれば言語も書いてください。


CC BY-SA 3.0
2015-04-21T06:42:21.540
9367
2015-04-21T06:42:21.540
8335
9359
answer


ファイルシステムから見たExcelのファイル操作は非常に複雑かつトリッキーです。  
具体的に書くと、単純に「名前を付けて保存」をするだけでも、開いたり閉じたり以下のような操作をしています。

> Book3.xlsx Created /  
>  Book3.xlsx Deleted /  
>  ~$Book3.xlsx Created / Hidden, Archive, NotContentIndexed  
>  ~$Book3.xlsx Changed / Hidden, Archive, NotContentIndexed  
>  A4AC1610 Created / Archive  
>  A4AC1610 Changed / Archive  
>  A4AC1610 Changed / Archive  
>  A4AC1610 Changed / Archive  
>  A4AC1610 Changed /  
>  A4AC1610 renamed to Book3.xlsx

アクセス権の確認やネットワーク上の共有フォルダへの書き込み確認など、複雑な条件下でエラーなく書き込むためにこのようなプロセスになっていると思われます。  
で、ご質問のケースでも厄介なのは、Excelが実ファイルとは別の一時ファイルを作成し、実ファイルを削除してから置き換える、というような処理を行っていると思われる点です。

なので、サンプルコードを見る限り、Excelのインスタンス作成はアプリから行われているようですから、このケースの場合、ファイルシステムから監視するのではなく、オートメーションでExcelを起動するアプローチがよいのではないかと思います。  
以下のサンプルのように、Excel.Application()オブジェクトでExcelのインスタンスを作成し、Excel本体のイベントを受け取ることで、WorkbookBeforeCloseイベントなどを処理する手法ではいかがでしょうか?

> HOW TO: Handle Events for Excel by Using Visual C# .NET  
>  <https://support.microsoft.com/en-us/kb/823981>  
>  方法: イベントを処理するには Visual C# を使用して優れています。NET (機械翻訳)  
>  <https://support.microsoft.com/ja-jp/kb/823981>


CC BY-SA 3.0
2015-04-22T03:20:34.650
9437
2015-04-22T03:20:34.650
2947
9359
answer


少し処理を追加して、読込排他ロックが取得できた後、  
一秒後に再度取得できるか試すようにしてみてはどうでしょう。

編集途中の文書ファイルを編集終了と誤判定するという現象なら、それで回避できそうです。


CC BY-SA 3.0
2015-04-22T09:54:26.003
9452
2015-04-22T09:54:26.003
8431
9359
answer