Windows用プログラムに関する質問です。WordやExcelなど、特定の拡張子を持つファイルについて、以下の動作をするソフトを作りたいのです。


 ・OSが付与するファイルのタイムスタンプの収集
 ・スタンプは、作成/更新/アクセスの3種類
 ・利用者がファイルを操作した場合、スタンプが変化する
 ・そのスタンプの変化を、追記的に書き出したい
 ・常駐的に監視したい

WinXPで動作することが条件です。ソースを希望しています。言語は何でも良いです。Winプログラムの開発は詳しくありませんが、標準のAPIやシステムコールを使った、スマートで負荷の少ない方法が希望です。全ドライブの監視が難しいようでしたら、特定のフォルダを指定し、その中身だけ監視する方法でも良いです。

トンチンカンな質問かもしれませんが、ご回答をお待ちしております。上記の処理やプログラムに関して知識をお持ちの方のみ、ご回答願います。ご紹介いただくURLの内容をご理解の上、ご回答ください。

当方の希望ズバリの場合は、100ptを送信します。次点は50~30、的はずれの場合は0とさせていただきます。独断ですが、ご了承ください。

以上、よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/05/18 12:01:27
  • 終了:2006/05/19 10:26:18

回答(3件)

id:kaorun No.1

kaorun回答回数44ベストアンサー獲得回数102006/05/18 13:29:22

ポイント50pt

そのものズバリのサンプルは思いつきませんが、
.NET(VB.NET/C#等)であれば、FileSystemWatcherで監視して、System.IO.Fileでタイムスタンプを取得すればわりと簡単に作れると思います。

DOBON.NET .NET Tips
フォルダ、ファイルの変更を監視する
http://dobon.net/vb/dotnet/file/filesystemwatcher.html

ファイルのコピー、削除、移動、属性の取得と変更、タイムスタンプの取得と変更
http://dobon.net/vb/dotnet/file/filecopy.html

あるフォルダ以下にあるファイルをすべて取得する
http://dobon.net/vb/dotnet/file/getfiles.html

MSDN FileSystemWatcher クラス
http://msdn2.microsoft.com/ja-JP/library/system.io.filesystemwat...

id:Mugicha2004

大変ありがたい情報、ありがとうございます。とても参考になります。Winプログラムの開発は、ほとんど初心者です。URL先を拝見しますね。

コマンドラインベースでも構わないので、ズバリのサンプルをご提示いただいた方には、200ptを送信します。わざわざお作りいただくのは恐縮ですので(割に合わないでしょうし..)、ズバリサンプルの掲載URLのご紹介でOKです。よろしくお願いいたします。

2006/05/18 13:33:35
id:Robe No.2

ロベール回答回数11ベストアンサー獲得回数02006/05/18 18:48:16

ポイント50pt

API を直接叩くのであれば、FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification という API を使えば実現できます。

C

http://www.athomejp.com/goldfish/api/filechangenotification.asp

Delphi

http://www.eva.hi-ho.ne.jp/taketani/delphi/file.shtml#0002

注意点

http://hp.vector.co.jp/authors/VA003580/tf/dev/dev05.html

MSDN

http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_...

http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_...

http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_...

ただ、どのファイルが変更されたのかまでは知ることができません。自分で調べる必要があります。.NET なら id:kaorun さんの FileSystemWatcher はどのファイルが変更されたかも分かるようなので、どちらを使った方がいいかは .NET を使うかどうか次第ですね。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...


もし、検知したいファイルが任意で、特定のファイルだけ検知したいというのでなければ、そのフォルダのファイルを列挙する必要があると思います。あるフォルダのファイルの列挙には FindFirstFile, FindNextFile, FindClose を使います。

C, VB

http://nienie.com/~masapico/api_FindFirstFile.html

MSDN

http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_...

http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_...

http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_...


タイムスタンプは GetFileTime で取得できます。ただ、世界標準時なので、FileTimeToLocalFileTime でローカル時間に変換してから使います。さらに、形式がちょっと特殊なので、FileTimeToSystemTime を使って普通の形式に変更して使います。

C

http://wisdom.sakura.ne.jp/system/winapi/win32/win112.html

MSDN

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_syst...


とりあえず、API を直接叩くならこんな感じです。

id:Mugicha2004

とても詳細なご回答、ありがとうございます。当方の希望、そのものズバリではありませんが、大いに参考になります。お二人よりお示しいただいた内容をもとに、ひとまず自分で組んでみたいと思います。また疑問点が出てくるかもしれません。その際は、よろしくお願いいたします。

2006/05/19 10:24:45
id:kenken8 No.3

kenken8回答回数67ベストアンサー獲得回数22006/05/18 16:36:28

ポイント40pt

kaorunさん同様に.NET FrameworkのFileSystemWatcherクラスを利用したらよいのではないでしょうか。

簡単なサンプルコードも掲載されているようです。

http://www.atmarkit.co.jp/fdotnet/dotnettips/281filewatch/filewa...

・タスクの例 : ファイル システムの変更を監視する

http://ja.gotdotnet.com/quickstart/howto/doc/watcher.aspx

参考になれば幸いです。

id:Mugicha2004

さらにご回答をいただいていることに気づきませんでした。こちらも参考にさせていただきますね。みなさま、ありがとうございました。

2006/05/19 10:25:41

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません