• 締切済み

ソフトウェアからオープンされているファイルの確認

macchunの回答

  • macchun
  • ベストアンサー率50% (3/6)
回答No.5

プログラムから特定のファイルが現在オープンされているか確認するには、非公開 API を使用しなければなりません(openfiles.exe も非公開 API を使用しているようです)。そのため、以下の実装方法については、参考意見として呼んでいただけるようお願いいたします。 あと、長文になることもご了承願います。 1. 特定のファイルを開き、デバイスパス名(フルパスではありません)を取得します。 HANDLE FileHandle = CreateFile(...); DWORD NameInfoSize = 1024; FILE_NAME_INFORMATION* NameInfo; NameInfo = (FILE_NAME_INFORMATION*)malloc(NameInfoSize); IO_STATUS_BLOCK IoStatus; if(NULL == NameInfo) { /*エラー処理*/ } NTSTATUS status = ZwQueryInformationFile(FileHandle, &IoStatus, FileNameInformation, NameInfoSize, NameInfo); if(status < 0) { if(0xC0000004L) { /*NameInfoSizeを大きくして再試行 */ } else { /*エラー処理*/ } } ※ 関数名、構造体にの詳細は検索していただけるようお願います。 2. システム全体で開いているすべてのハンドル情報を取得します。 詳細は参考URLの「ステップ2 ZwQuerySystemInformationによるシステムハンドルの取得」を参照願います。 3. (必要があれば)2. で取得したハンドル情報の一覧から対象プログラムのプロセスIDと同一のもの以外を一覧から削除します。 4. 3. で取得したハンドル情報のデバイスパス名を取得します。そのために、現在のプロセス上でアクセスするためにハンドルを複製します。 詳細は参考URLの「ステップ5 TDI Drivers用...」の下にある「カレントプロセスでのハンドルオープン」を参照願います。 5. 4. で作成したハンドルからデバイスパス名を取得します。やり方は 1. と同様です。 6. 1. で取得した名前と 5. で取得した名前とが同一のものがあるかを確認します。もしあれば、そのファイルは現在オープンされています。 実装方法は以上です。 ただ、実際に上記の内容を実装するのは結構大変だと思いますので、正直 _popen() などで openfiles.exe の出力をパイプで受け取る方法のほうがいいかもしれませんが・・・

参考URL:
http://codezine.jp/a/article.aspx?aid=101
BonRouge
質問者

お礼

回答ありがとうございます。参考にします。 LAN環境(Windowsのワークグループ環境)内でサーバの共有フォルダにあるファイル の新規・変更・削除・更新をリアルタイムに取得できないか?考えていました。 まず、サーバ管理者がサーバ上にあるファイルを操作した場合の情報取得をどうすれば? これはmacchunさんから回答していただいたAPIを参考にテストしてみます。 問題はクライアントからサーバ上の共有フォルダにあるファイルを新規・変更・削除・更新 を行った場合の情報をリアルタイムに取得できないかを今でも考えています。 Windowsネットワーク関係のAPIを使ってテストをしてみましたが、リアルタイムに情報を 取得できませんでした。NetSessionEnum、NetFileEnumなど(Net系のAPI)リアルタイム には使えないAPIでした。Winsock2で対応できるかなと?調べましたがダメでした。 できないはずはないのでこれからも調べてみます。 macchunさん、アドバイスありがとうございます。

関連するQ&A

  • ファイルオープンの挙動

    windows環境にてperlの勉強をしております。 http://www.rfs.co.jp/sitebuilder/perl/05/03.html#open を参考にopenを使っておりました。 ファイル書き込みがうまくできていないようなので 以下のようなテストプログラムを作成したのですが 上記のサイトのような挙動をしませんでした。 --source--- #!/usr/local/bin/perl print "Content-type: text/html\n\n"; open(FILE, "+> sample.txt"); $data = <FILE>; print "data = $data<br>"; $flag = print FILE "TEST MESSAGE"; print "flag=$flag<br>"; close(FILE); --source-- --sample.txt-- 実験です --sample.txt-- windows環境だと data = flag= と表示され linux環境(レンタルサーバ)だと data = flag=1 と表示されます。 私の予想では data = 実験です flag = 1 と表示されると思ったのですが何が原因でしょうか。 またlinuxとwindowsで結果が違うのは何か原因があり、 また修正可能でしょうか。 openに+>の挙動例が書いていないサイトもあることが 若干気になります。 もし+>自体が不安定なのでしたら安定して使えるもの をおしえてください。所望の挙動は読み取り+上書き書き込みです。 環境 windows2000 "an http daemon" linux (infoseekフリースペース) apache

    • ベストアンサー
    • Perl
  • テキストファイルの読み込み

    http://www.ajaxtower.jp/ini/html/index1.htmlにあるサンプルで xmlHttp.open("GET", "http://www.ajaxtower.jp/sample/readfile.txt", true); の、ファイルの場所を変えたいのですが、とりあえず、同じフォルダ内のテキストファイルtest.txtにアクセスしようと、"./test.txt"に変えて、クリックしても何も表示されませんでした。 apacheを起動してhtdocsにtest.txtを入れて"files://localhost/test.txt"に入れてもダメでした。 xmlHttp.openが読めるtextファイルは、どういう状態である必要があるのでしょうか?

  • VBでオープンしたファイルの制御をCのプログラムに渡す方法

    VBでファイルのオープンをしてそのファイルの制御を Cのプログラムに渡す方法ってありますか? やりたいことを具体的にいうと ファイルのオープン、クローズはVBでやって、 ループの中の変数の値を、Cのプログラムに渡して Cのプログラムの中で印字するって処理をやりたいのです。 Cのプログラムをコールする際の引数で VBで開いたファイルハンドル、出力したい変数の値を 渡してやれば良いのかなと思ったのですが、うまくいかないようです。 なにか方法があれば教えてください。 宜しくお願い致します。 Dim i as Integer Open "\test.txt" For Output As #1 for i=0 to 10 call Cのプログラム(#1、i) next i close #1

  • ファイルオープンの関数について教えてください。

    住所録保守のプログラムの宿題なんですが、ファイルオープンを関数にせずには動かせるのですが、関数にするとエラーが山のようにでます。参考書もよんでるのですがよくわかりません。明日提出なのでよろしくお願いします。                                     関数にする前の考えたプログラムは、                                            struct aaa{ char b                                                       char  c            };                                                         FILE *fp; struct aaa[100]; if((fp=fopen("c:/a.txt","rt"))==NULL) exit(0);です。                                         宿題は f_open(char *name,char *mode) を使って指定されたファイルを指定されたモードで開くという関数を作りなさい。                                                     引数 ポインタ nameはファイル名/mode はオープンモード 戻り値なし という問題です。 よろしくお願いいたします。

  • ファイルがオープンできない

    現在コマンドライン引数を利用した、Drag&Dropで入力されたバイナリファイルをテキストファイルに出力するプログラムをCで作成しています。 その過程で、Drag&Dropされたファイル以外にもテキストファイル(option.txt)を読み込みたいのですが、どうしてもそのファイルをオープンすることができません。 次は問題の部分だけを抜き出したソースです。 #include <stdio.h> int main(int argc,char *argv[]) {  FILE *s;  s=fopen("option.txt","r");  if( !s ){   printf("Error: cannot open file(option.txt)\n");  }   else printf("OK!\n");  if(argc == 2) printf("%s\n",argv[1]);  else if(argc ==1) printf("No Drag&Drop File\n");  return 0; } Drag&Dropしない時(作成された実行ファイルをダブルクリックで起動する時)は  OK!  No Drag&Drop File となり、問題のoption.txtのファイルは開けているのですが、適当なバイナリファイル(7.chn)をDrag&Dropすると  Error: cannot open file(option.txt)  C:\Documents and Settings\[ユーザー名]\デスクトップ\Program\7.chn と、先ほどまで開けていたoption.txtのテキストファイルが急に開けなくなってしまいました。 どうにも原因・解決策が分かりませんでしたので、お聞きしたくこちらに書き込みをさせてもらいました。 どなたか分かる方いらっしゃいましたらよろしくお願いします。

  • いやーマイクロソフトには苦労します

    メモ帳で空のファイルx.txtを作り これをGetAttributeでディレクトリかどうかを検査すると x.txtはディレクトリとみなされてしまいます 今x.txtがディレクトリだと動作が異常になる プログラムを作っていたので困っています そこでx.txtを排除するためにサイズを検査して0ならば 処理をしないようにしようと思ったのですが サイズを調べるのに void DispFileSize() { HANDLE hFile; DWORD FileSizeLow, FileSizeHigh; hFile = CreateFile( "\\command.com", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); FileSizeLow = GetFileSize(hFile, &FileSizeHigh); printf("ファイルサイズ: %ud*2^32 + %ud\n", FileSizeHigh, FileSizeLow); CloseHandle(hFile); } などいいう馬鹿らしい処理をしなければなりません しかもこれはディレクトリに適用するものではないのでうまくいくかどうか・・・ ファイルサイズを出すのに簡単にする方法はないのでしょうか? しかしAPIはやたら引数が多いしわけのわからない定数をいっぱい使いますね 泣きたくなります 開発者に問題があるのでしょうね

  • 実行時のlibxxx.soのオープンエラーについて

    こんにちは。 soralis上でテストを試みてますが、リンク先を呼び出した時にオープンエラーがでてるみたいです。エラーの解消方法はどうすればよろしいですか? 業務プログラムをテストドライバから引数を渡し、出力ファイルを吐かせるという流れをやりたいのですが、テストドライバを実行すると業務プログラムのオープンエラーですというメッセージがでます。 テストドライバから業務プログラムを呼び出している個所をコメントにするとエラーがでません。 原因がわからないので教えてください。よろしくお願いします。

  • ファイルダウンロードについて

    jspに<a href="ファイル名">ダウンロード</a> でそのファイルをダウンロードできると思ってましたが ダウンロードすることができません。 下記の様にアドレスを指定して試行錯誤している状態です。。 <a href="./test.txt">1</a> <a href="sample.csv">2</a> <a href="C:\test.txt">3</a> <a href="C:\\test.txt">4</a> <a href="C:\sample.csv">5</a> <a href="C:\\sample.csv">6</a> <a href="./sample.csv">7</a> <a href="C:/test.txt">8</a> <a href="C://test.txt">9</a> <a href="C:\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.csv">10</a> <a href="C:\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.txt">11</a> <a href="C:\\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.csv">12</a> <a href="C:\\Program Files\\Tomcat 6.0\\webapps\\servlet\\pages\\sample.csv">13</a> ちなみにOSはwindows XPです。 どなたかファイルのダウンロードについてご存じの方はご教授ください。

    • ベストアンサー
    • Java
  • 【Ruby】テキスト置換を1ファイル完結にしたい

    memo.txtの中に含まれている"俺の飯"という文字列を"私のごはん"というふうに置換を行いたいのですが、 現在のやり方だとファイルを開いて1行ずつ読み込んで新しいファイルに文字列を書きだしており 読み込んだ際、置換対象の文字列があった場合に置換して書きだしておりますが このやり方だとどうしても新規ファイルを出力しなければいけません。 これを新規ファイルを作らずにmemo.txtの中身だけを書き換えるようにするには どのような処理にすれば良いのでしょうか? 何卒宜しくお願い致します。 ---- sample.rb require 'rubygems' open("memo.txt"){ |f| open("after_memo.txt","w"){ |o| while line = f.gets line.gsub!("俺の飯", "私のごはん") o.puts line end } } -- memo.txt 俺の飯はリーズナブル! 俺の飯美味しそう!

    • ベストアンサー
    • Ruby
  • PHPでのファイルオープンの仕方について

    いつもこちらで勉強させていただいております。 初歩的な質問になるかもしれませんが、ご教授いただけたら幸いです。 windows7にて、VMware playerという仮想PCを作成するソフトを使い、Ubuntu(Linax)上でPHPの学習を行っております。 聞きたいこととしては、以下のプログラムを実行すると、 OPENエラー test.txt  と表示されるのはなぜなのか、ということです。 <html> <head> <title> ファイルにデータを書き込む </title> </head> <body> <?php $file_name = "test.txt"; $file = fopen($file_name, "a") or die("OPENエラー $file_name"); flock($file, LOCK_EX); $string = "文字列を書き込む"; fputs($file, $string); flock($file, LOCK_UN); fclose($file); ?> </body> </html> 参考書に載っていたプログラムそのまま書いたつもりですが、何がダメなのかが解りません。 設定ファイルか何かに特別なことをしなければいけないのでしょうか? 初歩的な質問になるかもしれませんが、聞ける人がいなく困っております。どなたかご存知の方がいらっしゃったら、教えて下さい。 以上、よろしくお願いします。

    • ベストアンサー
    • PHP