VB6 FileSystemObject DateCreated を正しくするには?

解決


まさお  2010-03-04 19:53:42  No: 102261

まさお  と申します。  宜しくお願い致します。 
 
  WinXP Pro SP2 VB6 SP6 です。

  本質問は別の掲示板 h ttp://www.moug.net/faq/viewtopic.php?t=49435  で質問し対処したので「解決済み」にしたのですが、原因不明のままですので、こちらで再質問させて戴く次第です。
 
  下記のプログラムで DateCreateB, DateCreateA が同じになってしまうのですが何故でしょうか? 
 
  Explorer で※の作成日時を確認すると DateCreateB の日時になっています。 
  正確な日時でFileを作成するにはどうすれば良いでしょうか? 
 
'====================Sleep関数定義 
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
 
Sub Test() 
    Const TarFullPath As String = "C:\test.txt"    'TargetFullPath 
     
    Dim FSO As Object 
    Dim DateCreateB As Date 'Before 
    Dim DateCreateA As Date 'After 
     
    '====================Set FileSystemObject 
        Set FSO = CreateObject("Scripting.FileSystemObject") 
     
    '====================Get DateCreateBefore 
        DateCreateB = FSO.GetFile(TarFullPath).DateCreated 
        FSO.DeleteFile TarFullPath 'TargetFullPath削除 
     
    '====================Wait 10sec 
        Call Sleep(10000) 
     
    '====================Create TarFullPath  '※ 
        With FSO.OpenTextFile(FileName:=TarFullPath, IOMode:=ForWriting, Create:=True) 
            .WriteLine Date & " " & Time 
            .Close 
        End With 
     
    '====================Get DateCreateAfter 
        DateCreateA = FSO.GetFile(TarFullPath).DateCreated 
     
    MsgBox DateCreateB & vbCrLf & DateCreateA 
End Sub 
 
以上、宜しくお願い致します。


魔界の仮面弁士  2010-03-04 22:02:44  No: 102262

FileSystemObject 云々というよりも、OS または
ファイルシステムの特性では無いでしょうか。
(処理対象のファイルシステムは、NTFS ですか?)

プログラムを使わずに、Explorer から操作してみたのですが、

(1) C:\test.txt の作成日を確認(たとえば3日前)。
(2) C:\other.txt の作成日を確認(たとえば5日前)。
(3) C:\test.txt を削除。
(4) C:\other.txt を C:\test.txt にリネーム。
(5) C:\test.txt の作成日を確認。

としたところ、短時間で処理した場合には、
C:\test.txt の作成日が 3 日前となり、
時間をおいた場合には 5 日前となっていました。

> ForWriting
定数を(Const定義せずに)使えるということは、参照設定しているのですよね。
であれば、
>    Dim FSO As Object 
>    Set FSO = CreateObject("Scripting.FileSystemObject") 
ではなく、アーリーバインドで記述した方が良いかと。


るしぇ  2010-03-04 22:53:41  No: 102263

リンク先でも発言しておりました。
> 処理対象のファイルシステムは、NTFS ですか?
はい。こちらはその環境でテストしました。
OS は WinXp Pro(SP3)です。

ボクの疑問に思った点は2点。
> Call Sleep(10000) 
これが短時間なのか?
Sleep(1)で動作が変わるならまだ分かるけど。。。

で、OpenTextFile の上書き(ファイル新規作成)と
思われる命令が、ファイルが存在しない場合に
失敗すること。

今までVBAとかでもファイルの作成はたくさん
やってきたので、結構重要な問題点だなぁって
思いまして、
> OS またはファイルシステムの特性では無いでしょうか。
詳しい情報があればぜひ聞きたいです。


まさお  2010-03-05 00:01:48  No: 102264

魔界の仮面弁士 さん、いつもありがとうございます。
るしぇ さん、リンク先ではありがとうございました。

> 処理対象のファイルシステムは、NTFS ですか?
ハイ。  NTFS です。

> 短時間で処理した場合には、C:\test.txt の作成日が 3 日前となり、
なるほど。  
Explorer で手作業で実行してもそうなるのですから、どうしようも
ないですネ。
Windowsの特性と考えることにします。

> アーリーバインドで記述した方が良いかと。
ハイ。  実プログラムは事前バインディングしています。
投稿する場合に参照設定していない人でも試行できるようにこのように
書いたのですが、ForWriting を思わず使ってしまいました。
#るしぇ さんにリンク先で「IOMode:=8 とかに変えました」と指摘されて
  いたのに又やってしまいました。

るしぇ さん指摘事項「ファイルが存在しない場合に失敗すること」は
私の環境では発生しないので、これにはコメントできないのですが、
『旧ファイル名と同じファイル名で保存してはいけない
  たとえ手作業であっても』
これは手作業でもかなり実行しており、その後、作成日順でソートする、
等を頻繁に行っていました。
ある時「あれ!?おかしいな」と思った事があるように記憶しています。
その時は自分の作業ミスだと思っていました。

今回は貴重な経験をしました。

暫く開けておきます。
追加のアドバイスがあればお願い致します。


魔界の仮面弁士  2010-03-05 02:28:13  No: 102265

> Windowsの特性と考えることにします。
VB の話題では無くなってしまいましたね。

>> 処理対象のファイルシステムは、NTFS ですか?
> ハイ。  NTFS です。

FAT ドライブでも再現しました。(エクスプローラからの操作)
--------------------------------------------------------
《Windows XP 上の FAT32 ボリューム(USBフラッシュメモリ)》

data.txt の日付を確認
    作成日:2010/01/28 11:49:21.75
    更新日:2010/01/28 11:53:18

test.txt の日付を確認
    作成日:2010/02/05 23:16:39.17
    更新日:2010/02/08 21:23:30

test.txt を削除

data.txt を test.txt にリネームしてから日付を確認
  作成日:2010/02/05 23:16:39.75
  更新日:2010/01/28 11:53:18
--------------------------------------------------------


魔界の仮面弁士  2010-03-05 02:31:06  No: 102266

> data.txt を test.txt にリネームしてから日付を確認
>   作成日:2010/02/05 23:16:39.75
    作成日:2010/02/05 23:16:39.17
でした。

# 10ミリ秒精度の部分は別ツールで確認していたので、転記しそこねた…。


YK  2010-03-05 16:41:43  No: 102267

こんにちは。
リンク先のるしぇさんの
Sleep 20000
は試されたのでしょうか。


スクリプトプログラマ  2010-03-05 18:02:14  No: 102268

[NT]Windows NT のファイル システム トンネリング機能
http://support.microsoft.com/kb/172190/ja
このことでは?


るしぇ  2010-03-05 18:11:16  No: 102269

> Sleep 20000
> は試されたのでしょうか。

>としたところ、短時間で処理した場合には、
>C:\test.txt の作成日が 3 日前となり、
>時間をおいた場合には 5 日前となっていました。
魔界の仮面弁士さんは、手動で Explorer から。
まさお さんも動作確認くらいはしてくれてそうです。

…でも、じゃあ、短時間と時間をおいた場合の境界は何秒?
それはPCスペックなど環境依存?
といったことを考えると、プログラムでの解決策には
結びつきそうに無い内容だと思っています。
…まぁ、もともと、原因が知りたいって質問ですが。

仮に30秒待てば、確実に作成日付になるよって分かっても
ファイル操作でそんな待ち時間は現実的でないでしょうし。

余談ですが
> で、OpenTextFile の上書き(ファイル新規作成)と
> 思われる命令が、ファイルが存在しない場合に
> 失敗すること。
再現しなくなった(;;開発環境入替え時かなぁ。。。


るしぇ  2010-03-05 18:55:12  No: 102270

>[NT]Windows NT のファイル システム トンネリング機能
それっぽいです!MaximumTunnelEntryAgeInSeconds を 5(秒)にしたら、
最初の質問のコードで作成日付が変更されるようになりました。

…実際にこのレジストリ値を変更して開発するかどうかは別にして。


まさお  2010-03-05 23:57:11  No: 102271

皆さん、ありがとうございます。

  返信が遅れており申し訳ございません。

> Sleep 20000
> は試されたのでしょうか。
  ハイ。一応  10000 〜 3000 迄は試行しました。
  しかし、15000 でOKでも、16000 ではNG、等その時の動作に影響された
のであまり意味は無い、と考えました。

>[NT]Windows NT のファイル システム トンネリング機能
  スクリプトプログラマさん、ありがとうございました。
  原因が判りました。
  るしぇ  さんのご指摘の通り、この為にレジストリ値を変更する気は
しませんが、原因が判ってスッキリしました。

皆さん、本当にありがとうございました。

解決しました。
暫くしたら閉じます。


まさお  2010-03-06 01:20:38  No: 102272

まったく無関係な話ですが…。
魔界の仮面弁士さんに試行して戴いた結果。
> data.txt を test.txt にリネームしてから日付を確認
>  作成日:2010/02/05 23:16:39.75
>  更新日:2010/01/28 11:53:18

  これって、作成日より更新日の方が古いファイル、って訳ですネ。
  知らない人が見たら「???」ですネ。(^^)

「解決」にします。  先輩諸兄、本当にありがとうございました。


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

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






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