キャッシュファイルがアクセス中かどうかを調べる方法は?

解決


ビギナープログラマ(仮)  2007-08-22 22:19:47  No: 27480

閲覧ありがとうございます。

現在作っているプログラムでIEのキャッシュを取得する作業をしているのですが、
一度読み込んだキャッシュファイルを再度読み込まないようにする対応策として、キャッシュの変更日時(アクセス日時?)を取得し、
関数が実行された日時と比較してキャッシュファイルの一覧を生成する、といった方法を取っています。
そこまでは何とか成功したのですが、日時取得に失敗するときがあり、
どうやらIEで現在閲覧中のファイルのタイムデータはうまく取得できないことがわかりました。
そこでアクセス中のファイルは別に保存しておき、後からデータを取得しなおすという方向で行こうと思っているのですが、
IEでそのファイルが開かれているかどうかを調べる方法などはあるでしょうか?
もしくはアクセス中のファイルのデータを取得する方法などありましたら、ご指南よろしくお願い致します。

以下のサイトさまを参考にしております
ttp://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_InternetCacheHistroy.htm
ttp://www.occn.zaq.ne.jp/maekawa/delphitip/index.html#c009

真剣にプログラミングを始めたばかりの初心者で、ネット上のサイト様からお知恵をお借りしている部分が
多く、完全に理解していないところもあるためソースに矛盾点などがあるかもしれず…理解し難い点がありましたらその辺もご指摘くだされば幸いです。

現在のソースです。

///button2でキャッシュリスト(memo1)から新しく更新されたものだけ取得
procedure TForm1.Button2Click(Sender: TObject);
var lFileDateTime : TFileDateTime;
cashdatetime:TDatetime;
i:integer;
newcash:Tstringlist;//取得したいキャッシュリスト
nowtime:Tdatetime;

begin
nowtime:=now;//現在のdatetime取得。
showmessage(formatdatetime('yyyy/mm/dd hh:nn:ss',cashgettimeb));
newcash:=Tstringlist.Create;
listbox1.items.Clear;
    for i:=0 to memo1.Lines.Count-1 do begin
      lFileDateTime := getFileDate(memo1.Lines[i]);//キャッシュファイルi行目の日時取得
      cashdatetime:=lFileDateTime.ModifyDate;//cashdatetimeはアクセス日時
      //showmessage(formatdatetime('yyyy/mm/dd hh:nn:ss',cashdatetime));
       //showmessage(memo1.Lines[i]);
        if comparedatetime(cashdatetime,cashgettimeb)>0 then begin;//もし以前button2を押した日付よりキャッシュの更新日時が後だったら
          newcash.Add(memo1.lines[i]);
        end;
    end;
cashgettimeb:=nowtime;
//showmessage('WRY!'+formatdatetime('yyyy/mm/dd hh:nn:ss',cashgettimeb));
listbox1.Items.Assign(newcash);
Label5.Caption:='該当数 : '+IntToStr(newcash.Count);
newcash.free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
cashgettimeb:=0;
end;

end.

//関数 getfiledate=ファイルの各日時を取得
function getFileDate(strFile: String):TFileDateTime;
var
  hFile: integer;

  ftCreateDate,
  ftModifyDate,
  ftAccessDate: TFileTime;
  lftCreateDate,
  lftModifyDate,
  lftAccessDate: TFileTime;
  stCreateDate,
  stModifyDate,
  stAccessDate: TSystemTime;

  lFileDateTime : TFileDateTime;
begin

  hFile:=FileOpen(strFile,fmOpenRead); //読みとり専用でファイルを開く
  GetFileTime(hFile,@ftCreateDate,@ftAccessDate,@ftModifyDate); //ファイルの日時を取得
  FileClose(hFile); //ファイルを閉じる

{ローカル日時に変更}
  FileTimeToLocalFileTime(ftCreateDate,lftCreateDate);
  FileTimeToLocalFileTime(ftModifyDate,lftModifyDate);
  FileTimeToLocalFileTime(ftAccessDate,lftAccessDate);
  {システム日時に変更}
  FileTimeToSystemTime(lftCreateDate,stCreateDate);
  FileTimeToSystemTime(lftModifyDate,stModifyDate);
  FileTimeToSystemTime(lftAccessDate,stAccessDate);

  lFileDateTime.CreateDate := SystemTimeToDateTime(stCreateDate);
  lFileDateTime.ModifyDate := SystemTimeToDateTime(stModifyDate);
  lFileDateTime.AccessDate := SystemTimeToDateTime(stAccessDate);

  Result := lFileDateTime;
end;

end.


もにゃ  2007-08-23 03:32:01  No: 27481

ファイルがアクセス中かどうかというとこだけ。
この状態を確認する関数はありません、
実際にアクセスしてみて例外が帰ってくれば使用中と判断するしかありません。


Fusa  2007-08-24 22:58:46  No: 27482

DelFusa Library - Delphi OpenSource - DelFusa Floor
http://delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070708185145/FileUnit/FileUnit.pas
FileInUse、こちらどうぞです。


ビギナープログラマ(仮)  2007-08-26 11:17:47  No: 27483

>もにゃ様
アドバイスありがとうございます!元元はそういった関数はないのですね…
今回はFusa様に関数をいただけて幸運でしたが、もしアクセス関係のもので他にどうしようもないエラーが発生しましたら
元元考えていた「取得時刻がおかしなものだけ保管しておいてもう一度取り直す」という方法を取ろうと思います。

>Fusa様
ありがとうございます…!
まさにぴったりの関数を提供していただき、本当に助かりました。
早速開発で使用させていただきます。

お二人とも、本当にありがとうございました。


ビギナープログラマ(仮)  2007-08-26 11:19:41  No: 27484

申し訳ありません、解決し忘れてしまいました;
改めまして、今回はこれにて占めさせていただきます…ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加