none
ファイルが開いているかを調べるには? RRS feed

  • 質問

  • おせわになります。

     

    ファイルが開いていなければ開き、ファイルが開いていれば何もしないという処理を行いたいのですが、どうしたらよいのでしょうか?

     

    どうぞ、よろしくお願いします。

    2008年9月5日 22:40

回答

  •  yem さんからの引用

    ファイルが開いていなければ開き、ファイルが開いていれば何もしないという処理を行いたいのですが、どうしたらよいのでしょうか?

    質問の意図が読めませんでした。

     

    「ファイルが開いていれば」あるいは「ファイルを開いていなければ」とはどういうことですか?

    また、「ファイルが開いていなければ開き」の後半の「開き」はどういったことをしたいのですか?

     

    解釈の一例として、「他のアプリケーションで使用中でなければFileStreamで開く」、「メモ帳と似たようなテキストエディタを作っており、今開いているファイルと同じファイルを指定されたときは無視したい」など。

     

    もう少し、今やりたいこと、躓いている部分を明確に提示してみましょう。

    2008年9月6日 0:09
    モデレータ
  • Azuleanさんが言われている通りなのですが、他のプロセスが開いているという場合と仮定すれば、FileStreamやFile.Openで開いてみて例外が発生すれば既に開かれていると判断するのが一般的な手法でしょう。ただし、FileStreamやFile.Openで開けた場合でも、他のプロセスによってそのファイルが既に開かれていることもあります。その場合でも、他のプロセスが自分以外にファイルを開くことを認めているのですから、実際はFileStreamやFile.Openで開ければOKという判断で済むのではないかと思います。他のプロセスがそのファイルを開いているかどうかにかかわらず、自分のプログラムでそのファイルに所望の操作ができるわけですから。

     

    一方、自分のプログラムで既にあるファイルを開いているかどうかを判断するのは簡単ですよね。自分で何のファイルを開いているのかを記憶しておけばいいのですから。

    2008年9月6日 2:04
    モデレータ
  • >また、質問とは別に、このようなことを表現する場合は、どんなふうな文で表わしたらよかったのでしょうか?

    >ついでながら、教えていただけるとありがたいのです。


    どのように表現する、という正解があるわけではありません。

    コミュニケーションにおいて、相手に内容が理解されないときは、多くの場合は伝える側に問題があります。

    以下のリンクが、指標のひとつとなるのではないでしょうか。


    http://www.hyuki.com/writing/techask.html

    2008年9月7日 6:41
  •  yem さんからの引用

    Excel やWordなどが開いているとき、そのファイルをアイコンのダブルクリックなどで、さらに開こうとすると、2重に開くと操作中の内容が破棄されてしまいますので、それを防ぎたいので、開いているかを確かめたいというだけです。


    これでもまだはっきりわからないのですが、推測できるのは、Excelなどで既に開かれているファイルをyemさんの作成されたアプリケーションでは開きたくないということですよね?

     

     yem さんからの引用

    また、質問とは別に、このようなことを表現する場合は、どんなふうな文で表わしたらよかったのでしょうか?

    何が何をというように、少なくとも主語と目的語をはっきり書いた方が良いでしょう。yemさんの最初に投稿には主語がありません。何が、何を、どのような環境でというように、できるだけ多くの情報がある方が一般的に解決に結びつきやすくなります。

    2008年9月7日 8:11
    モデレータ
  • 開いているファイルから、それを開いているプロセスを見つけるのは簡単ではないようです。ただし、openfilesというコマンドがありますので不可能ではないようですが、どうやら非公開APIを使用しているのではないかという情報もあります。

    少し検索してみましたが、それらしいC#のコードがありました。 私は試したことがありませんのであらゆる面で保障はできませんが、とりあえず紹介しておきます。名前からすると、プロセスからそれが開いているファイルを見つけるのではないかと思いますが、プロセスとそれが開いているファイルの一覧さえ手に入れば目的は達せられると思います。

     

    Active File Names from Process
    http://www.axcis.com.au/bb/viewtopic.php?p=505

     

    あとはopenfilesの結果を受け取るという方法も考えられます。

    2008年9月7日 14:41
    モデレータ
  • こんにちは。中川俊輔 です。

     

    皆様、回答ありがとうございます。

     

    yemさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    勝手ながら、有用な情報と思われる回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    yemさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年9月18日 8:34

すべての返信

  •  yem さんからの引用

    ファイルが開いていなければ開き、ファイルが開いていれば何もしないという処理を行いたいのですが、どうしたらよいのでしょうか?

    質問の意図が読めませんでした。

     

    「ファイルが開いていれば」あるいは「ファイルを開いていなければ」とはどういうことですか?

    また、「ファイルが開いていなければ開き」の後半の「開き」はどういったことをしたいのですか?

     

    解釈の一例として、「他のアプリケーションで使用中でなければFileStreamで開く」、「メモ帳と似たようなテキストエディタを作っており、今開いているファイルと同じファイルを指定されたときは無視したい」など。

     

    もう少し、今やりたいこと、躓いている部分を明確に提示してみましょう。

    2008年9月6日 0:09
    モデレータ
  • Azuleanさんが言われている通りなのですが、他のプロセスが開いているという場合と仮定すれば、FileStreamやFile.Openで開いてみて例外が発生すれば既に開かれていると判断するのが一般的な手法でしょう。ただし、FileStreamやFile.Openで開けた場合でも、他のプロセスによってそのファイルが既に開かれていることもあります。その場合でも、他のプロセスが自分以外にファイルを開くことを認めているのですから、実際はFileStreamやFile.Openで開ければOKという判断で済むのではないかと思います。他のプロセスがそのファイルを開いているかどうかにかかわらず、自分のプログラムでそのファイルに所望の操作ができるわけですから。

     

    一方、自分のプログラムで既にあるファイルを開いているかどうかを判断するのは簡単ですよね。自分で何のファイルを開いているのかを記憶しておけばいいのですから。

    2008年9月6日 2:04
    モデレータ
  • ご回答ありがとうございます。

     

    質問の趣旨をうまく伝えられなかったようで、恐縮です。

    趣旨は単純で、

    Excel やWordなどが開いているとき、そのファイルをアイコンのダブルクリックなどで、さらに開こうとすると、2重に開くと操作中の内容が破棄されてしまいますので、それを防ぎたいので、開いているかを確かめたいというだけです。

     

    これが今回の質問の内容です。

     

    また、質問とは別に、このようなことを表現する場合は、どんなふうな文で表わしたらよかったのでしょうか?

    ついでながら、教えていただけるとありがたいのです。

     

    どうぞ、よろしくお願いします。

    2008年9月7日 6:27
  • >また、質問とは別に、このようなことを表現する場合は、どんなふうな文で表わしたらよかったのでしょうか?

    >ついでながら、教えていただけるとありがたいのです。


    どのように表現する、という正解があるわけではありません。

    コミュニケーションにおいて、相手に内容が理解されないときは、多くの場合は伝える側に問題があります。

    以下のリンクが、指標のひとつとなるのではないでしょうか。


    http://www.hyuki.com/writing/techask.html

    2008年9月7日 6:41
  •  yem さんからの引用

    Excel やWordなどが開いているとき、そのファイルをアイコンのダブルクリックなどで、さらに開こうとすると、2重に開くと操作中の内容が破棄されてしまいますので、それを防ぎたいので、開いているかを確かめたいというだけです。


    これでもまだはっきりわからないのですが、推測できるのは、Excelなどで既に開かれているファイルをyemさんの作成されたアプリケーションでは開きたくないということですよね?

     

     yem さんからの引用

    また、質問とは別に、このようなことを表現する場合は、どんなふうな文で表わしたらよかったのでしょうか?

    何が何をというように、少なくとも主語と目的語をはっきり書いた方が良いでしょう。yemさんの最初に投稿には主語がありません。何が、何を、どのような環境でというように、できるだけ多くの情報がある方が一般的に解決に結びつきやすくなります。

    2008年9月7日 8:11
    モデレータ
  • GX999さん、たいへん参考になるものを紹介いただき、ありがとうございます。

     

    まだ、読み切れていませんが、ぜひとも参考にさせていただきます。

     

    2008年9月7日 8:14
  • 国語が苦手で、うまく伝わらず申し訳ありません。

     

    Excel の指定のファイルを開きたいということなのです。

     

    開く処理は、簡単に

    System.Diagnostics.Process.Start("ファイル名");

    という処理で済みます。

     

    が、すでにExcelファイルが開いているときに、このコードを実行すると、

    Excel側から、2重に開くとこれまでの処理が無効になるとのメッセージを返してきます。

     

    これを防ぐために、指定のExcelファイルが開いていたら、開かないようにしたいのです。

     

    可能でしょうか?

    その前にわかっていただけたでしょうか?

     

    いかがでしょうか?よろしくお願いします。
    2008年9月7日 9:33
  • 開いているファイルから、それを開いているプロセスを見つけるのは簡単ではないようです。ただし、openfilesというコマンドがありますので不可能ではないようですが、どうやら非公開APIを使用しているのではないかという情報もあります。

    少し検索してみましたが、それらしいC#のコードがありました。 私は試したことがありませんのであらゆる面で保障はできませんが、とりあえず紹介しておきます。名前からすると、プロセスからそれが開いているファイルを見つけるのではないかと思いますが、プロセスとそれが開いているファイルの一覧さえ手に入れば目的は達せられると思います。

     

    Active File Names from Process
    http://www.axcis.com.au/bb/viewtopic.php?p=505

     

    あとはopenfilesの結果を受け取るという方法も考えられます。

    2008年9月7日 14:41
    モデレータ
  • こんにちは。中川俊輔 です。

     

    皆様、回答ありがとうございます。

     

    yemさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    勝手ながら、有用な情報と思われる回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    yemさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年9月18日 8:34