人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

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

●質問者: Mugicha2004
●カテゴリ:コンピュータ
✍キーワード:API Excel OS URL WIN
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kaorun
●50ポイント

そのものズバリのサンプルは思いつきませんが、
.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...

◎質問者からの返答

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

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


2 ● ロベール
●50ポイント

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 を直接叩くならこんな感じです。

◎質問者からの返答

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


3 ● kenken8
●40ポイント

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

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

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

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

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

参考になれば幸いです。

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ