• 締切済み

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

macchunの回答

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

LAN環境内でサーバの共有フォルダにあるファイルの新規・変更・削除・更新をリアルタイムに取得するとなりますと、フォルダの変更通知APIを使用したほうが良いと思います。 サンプルは下記のとおりです(注意:エラー処理は省いています)。 HANDLE folderHandle = CreateFile( "\\server\share", // ファイル名へのポインタ FILE_LIST_DIRECTORY, // アクセス( 読み書き)モード FILE_SHARE_READ|FILE_SHARE_DELETE, // 共有モード NULL, // セキュリティ記述子 OPEN_EXISTING, // 作成方法 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, // ファイル属性 NULL // コピーするファイルと属性 ); bufferSize = 1024; FILE_NOTIFY_INFORMATION* buffer= malloc(bufferSize); while(1) { BOOL fResult; OVERLAPPED overlapped; overlapped.hEvent=CreateEvent(...); fResult = ReadDirectoryChangesW( folderHandle, // 監視するディレクトリのハンドル buffer, // 読み取った結果を受け取るバッファへのポインタ bufferSize, // buffer の長さ FALSE, // ディレクトリまたはディレクトリツリーを監視するためのフラグ(TRUEでも可) FILE_NOTIFY_CHANGE_FILE_NAME | ... , // 監視に使うフィルタ条件 NULL, // 返されたバイト数 &overlapped, // 重複 I/O 操作に必要な構造体へのポインタ NULL // 完了ルーチンへのポインタ ); if(FALSE == fResult) {/* エラー処理 */ break; } WaitForSingleObject(overlapped.hEvent, ...); DWORD resultSize; GetOverlappedResult(folderHandle, &overlapped, &resultSize, FALSE); // buffer に変更されたファイル名と変更内容が記録されています // 変更検出後の処理をここに記述します } ただ、共有フォルダを対象としたときに変更が検出されるケースとされないケースがあるようです(エクスプローラで共有フォルダの変更が検出できる場合にはこの方法で機能しますが、どのような条件で変更検出が機能しないかはわかりませんでした・・・)。 また、リアルタイム性もそれほど高くありません(変更後数秒かかる場合もあります)。 もし、より正確でリアルタイム性を求めるのでしたら 1. 上記変更検出ルーチンをファイル共有サーバに導入する 2. サーバが変更を検出したらクライアントにデータグラムパケットを送出し、変更検出を通知する。 方法もございます(ここで書いておいて難ですが私はあまり推奨しません・・・) 以上です。 ※ #4 で一点間違えがありました、ごめんなさい!この場で修正させてください。 1. の ZwQueryInformationFile() は ZwQueryObject() の間違いでした(ZwQueryInformationFile() ではドライブ名に該当する部分が取得できません)。 プロトタイプは ypedef enum _OBJECT_INFORMATION_CLASS{ ObjectBasicInformation, ObjectNameInformation, ObjectTypeInformation, ObjectAllInformation, ObjectDataInformation } OBJECT_INFORMATION_CLASS; typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING ObjectName; } OBJECT_NAME_INFORMATION; NTSYSAPI NTSTATUS NTAPI ZwQueryObject( IN HANDLE ObjectHandle OPTIONAL, IN OBJECT_INFORMATION_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG Length, OUT PULONG ResultLength ); で、 OBJECT_NAME_INFORMATION* NameInfo; ULONG ResultLength; NTSTATUS status = ZwQueryObject(FileHandle, ObjectNameInformation, NameInfo, NameInfoSize, &ResultLength); のように使います。

参考URL:
http://www.microsoft.com/japan/msdn/library/ja/jpfileio/html/_win32_ReadDirectoryChangesW.asp

関連する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