まさお と申します。 宜しくお願い致します。
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
以上、宜しくお願い致します。
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")
ではなく、アーリーバインドで記述した方が良いかと。
リンク先でも発言しておりました。
> 処理対象のファイルシステムは、NTFS ですか?
はい。こちらはその環境でテストしました。
OS は WinXp Pro(SP3)です。
ボクの疑問に思った点は2点。
> Call Sleep(10000)
これが短時間なのか?
Sleep(1)で動作が変わるならまだ分かるけど。。。
で、OpenTextFile の上書き(ファイル新規作成)と
思われる命令が、ファイルが存在しない場合に
失敗すること。
今までVBAとかでもファイルの作成はたくさん
やってきたので、結構重要な問題点だなぁって
思いまして、
> OS またはファイルシステムの特性では無いでしょうか。
詳しい情報があればぜひ聞きたいです。
魔界の仮面弁士 さん、いつもありがとうございます。
るしぇ さん、リンク先ではありがとうございました。
> 処理対象のファイルシステムは、NTFS ですか?
ハイ。 NTFS です。
> 短時間で処理した場合には、C:\test.txt の作成日が 3 日前となり、
なるほど。
Explorer で手作業で実行してもそうなるのですから、どうしようも
ないですネ。
Windowsの特性と考えることにします。
> アーリーバインドで記述した方が良いかと。
ハイ。 実プログラムは事前バインディングしています。
投稿する場合に参照設定していない人でも試行できるようにこのように
書いたのですが、ForWriting を思わず使ってしまいました。
#るしぇ さんにリンク先で「IOMode:=8 とかに変えました」と指摘されて
いたのに又やってしまいました。
るしぇ さん指摘事項「ファイルが存在しない場合に失敗すること」は
私の環境では発生しないので、これにはコメントできないのですが、
『旧ファイル名と同じファイル名で保存してはいけない
たとえ手作業であっても』
これは手作業でもかなり実行しており、その後、作成日順でソートする、
等を頻繁に行っていました。
ある時「あれ!?おかしいな」と思った事があるように記憶しています。
その時は自分の作業ミスだと思っていました。
今回は貴重な経験をしました。
暫く開けておきます。
追加のアドバイスがあればお願い致します。
> 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
--------------------------------------------------------
> data.txt を test.txt にリネームしてから日付を確認
> 作成日:2010/02/05 23:16:39.75
作成日:2010/02/05 23:16:39.17
でした。
# 10ミリ秒精度の部分は別ツールで確認していたので、転記しそこねた…。
こんにちは。
リンク先のるしぇさんの
Sleep 20000
は試されたのでしょうか。
[NT]Windows NT のファイル システム トンネリング機能
http://support.microsoft.com/kb/172190/ja
このことでは?
> Sleep 20000
> は試されたのでしょうか。
>としたところ、短時間で処理した場合には、
>C:\test.txt の作成日が 3 日前となり、
>時間をおいた場合には 5 日前となっていました。
魔界の仮面弁士さんは、手動で Explorer から。
まさお さんも動作確認くらいはしてくれてそうです。
…でも、じゃあ、短時間と時間をおいた場合の境界は何秒?
それはPCスペックなど環境依存?
といったことを考えると、プログラムでの解決策には
結びつきそうに無い内容だと思っています。
…まぁ、もともと、原因が知りたいって質問ですが。
仮に30秒待てば、確実に作成日付になるよって分かっても
ファイル操作でそんな待ち時間は現実的でないでしょうし。
余談ですが
> で、OpenTextFile の上書き(ファイル新規作成)と
> 思われる命令が、ファイルが存在しない場合に
> 失敗すること。
再現しなくなった(;;開発環境入替え時かなぁ。。。
>[NT]Windows NT のファイル システム トンネリング機能
それっぽいです!MaximumTunnelEntryAgeInSeconds を 5(秒)にしたら、
最初の質問のコードで作成日付が変更されるようになりました。
…実際にこのレジストリ値を変更して開発するかどうかは別にして。
皆さん、ありがとうございます。
返信が遅れており申し訳ございません。
> Sleep 20000
> は試されたのでしょうか。
ハイ。一応 10000 〜 3000 迄は試行しました。
しかし、15000 でOKでも、16000 ではNG、等その時の動作に影響された
のであまり意味は無い、と考えました。
>[NT]Windows NT のファイル システム トンネリング機能
スクリプトプログラマさん、ありがとうございました。
原因が判りました。
るしぇ さんのご指摘の通り、この為にレジストリ値を変更する気は
しませんが、原因が判ってスッキリしました。
皆さん、本当にありがとうございました。
解決しました。
暫くしたら閉じます。
まったく無関係な話ですが…。
魔界の仮面弁士さんに試行して戴いた結果。
> data.txt を test.txt にリネームしてから日付を確認
> 作成日:2010/02/05 23:16:39.75
> 更新日:2010/01/28 11:53:18
これって、作成日より更新日の方が古いファイル、って訳ですネ。
知らない人が見たら「???」ですネ。(^^)
「解決」にします。 先輩諸兄、本当にありがとうございました。
ツイート | ![]() |