SetFileTime でファイル時刻を変更した直後にタスクを終了することなく GetFileTime でファイル時刻を取得するとなぜか変更内容が破棄されます。
タスクを終了すると変更内容が有効になっていますのでおそらくディスクキャッシュの影響とおもわれます。
関係情報・関係情報が記載されているコンパイルされたHTMLファイル・検索用シソーラス等お知らせ願えませんか。
プログラム作成環境
Visual Stiudio 6.0
Visual Basic SP5パッチ済
Windows 98SE 4.1
実行予定環境(作成時の障害の為現時点では実行経験なし)
Windows 95
Windows 98
No.3ベストアンサー
- 回答日時:
動作確認済みソースです。
(EXCEL.VBAにて)WinXPsp2
Excel2000sp3(VBA)
この環境では、Doeventsを利用しないでも、1日づつ日付が変更になりました。
OSによって違うのか、ソースに不具合があるか、実行して差を教えてください。
Option Explicit
Private Const DEF_FILE As String = "C:\テスト.txt"
' セキュリティを定義する構造体
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
' ファイルハンドルの値が無効であることを示す定数の宣言
Private Const INVALID_HANDLE_VALUE = (-1)
' オブジェクトへのアクセスの種類を指定する定数の宣言
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
' ファイルへの動作を指定する定数の宣言
Private Const OPEN_EXISTING = 3
' ファイルなどの作成やオープンや切り捨てを行う関数の宣言
Private Declare Function CreateFile Lib "kernel32.dll" _
Alias "CreateFileA" _
(ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
lpSecurityAttributes As SECURITY_ATTRIBUTES, _
ByVal dwCreationDistribution As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long
' オープンされているオブジェクトハンドルをクローズする
' 関数の宣言
Private Declare Function CloseHandle Lib "kernel32.dll" _
(ByVal hObject As Long) As Long
' 日付と時刻を定義する構造体
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
' ファイル時間を定義する構造体
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
' システム時間をファイル時間に変換する関数の宣言
Private Declare Function SystemTimeToFileTime Lib "kernel32.dll" _
(lpSystemTime As SYSTEMTIME, _
lpFileTime As FILETIME) As Long
' ファイル時間をシステム時間に変換する関数の宣言
Private Declare Function FileTimeToSystemTime Lib "kernel32.dll" _
(lpFileTime As FILETIME, _
lpSystemTime As SYSTEMTIME) As Long
' ファイルの作成日時などを設定する関数の宣言
Private Declare Function SetFileTime Lib "kernel32.dll" _
(ByVal hFile As Long, _
lpCreationTime As FILETIME, _
lpLastAccessTime As FILETIME, _
lpLastWriteTime As FILETIME) As Long
' ファイルの作成日時などを取得する関数の宣言
Private Declare Function GetFileTime Lib "kernel32.dll" _
(ByVal hFile As Long, _
lpCreationTime As FILETIME, _
lpLastAccessTime As FILETIME, _
lpLastWriteTime As FILETIME) As Long
Sub Test()
Dim datTime As Date
Debug.Print String(26, "-")
'1回目取得
Call funcGetTime(DEF_FILE, datTime)
Debug.Print "1.取得" & datTime
'1日引いて更新
Call funcSetTime(DEF_FILE, datTime - 1)
'2回目取得
Call funcGetTime(DEF_FILE, datTime)
Debug.Print "2.取得" & datTime
Debug.Print String(26, "-")
End Sub
Private Function funcGetTime(ByVal inFile As String, ByRef otTime As Date) As Boolean
Dim lngOpenFileHandle As Long
Dim udtCreationTime As FILETIME
Dim udtLastAccessTime As FILETIME
Dim udtLastWriteTime As FILETIME
'ファイルを取得モードでオープン
If Not APICreateFile(inFile, False, lngOpenFileHandle) Then
Exit Function
End If
' ファイルの作成日時を取得
Call GetFileTime(lngOpenFileHandle, _
udtCreationTime, _
udtLastAccessTime, _
udtLastWriteTime)
'【変換】ファイル時間→日付
Call FileTime_To_Date(udtLastWriteTime, otTime)
'ファイルをクローズ
Call APICloseHandle(lngOpenFileHandle)
funcGetTime = True
End Function
Private Function funcSetTime(ByVal inFile As String, ByVal inTime As Date) As Boolean
Dim lngOpenFileHandle As Long
Dim udtCreationTime As FILETIME
Dim udtLastAccessTime As FILETIME
Dim udtLastWriteTime As FILETIME
'ファイルを更新モードでオープン
If Not APICreateFile(inFile, True, lngOpenFileHandle) Then
Exit Function
End If
' ファイルハンドルの値が無効であるときは抜ける
If lngOpenFileHandle = INVALID_HANDLE_VALUE Then
Exit Function
End If
'【変換】日付→ファイル時間
Call Date_To_FileTime(inTime, udtLastWriteTime)
'ファイルの更新日時を設定
Call SetFileTime( _
lngOpenFileHandle _
, udtCreationTime _
, udtLastAccessTime _
, udtLastWriteTime _
)
'ファイルをクローズ
Call APICloseHandle(lngOpenFileHandle)
funcSetTime = True
End Function
Private Sub APICloseHandle(ByRef inFileHandle As Long)
If inFileHandle <> 0 Then
Call CloseHandle(inFileHandle)
End If
inFileHandle = 0
End Sub
Private Function APICreateFile(ByVal inFile As String, ByVal inSetMode As Boolean, Optional ByRef otFileHandle As Long) As Boolean
Dim udtSecurityAttributes As SECURITY_ATTRIBUTES
Dim lngOpenFileHandle As Long
'初期化
Call APICloseHandle(otFileHandle)
' セキュリティ構造体を初期化
udtSecurityAttributes.nLength = Len(udtSecurityAttributes)
' ファイルをオープン
lngOpenFileHandle = _
CreateFile(inFile, _
IIf(inSetMode, GENERIC_WRITE, GENERIC_READ), _
0, _
udtSecurityAttributes, _
OPEN_EXISTING, _
0, _
0)
'ステータスチェック
APICreateFile = Not (lngOpenFileHandle = INVALID_HANDLE_VALUE)
If APICreateFile Then
'正常ケースは、ハンドルを返す
otFileHandle = lngOpenFileHandle
End If
End Function
Private Sub Date_To_FileTime(ByVal inDate As Date, otFileTime As FILETIME)
Dim udtSystemTime As SYSTEMTIME
'【変換】日付→システム時間
With udtSystemTime
.wYear = Year(inDate)
.wMonth = Month(inDate)
.wDay = Day(inDate)
.wHour = Hour(inDate)
.wMinute = Minute(inDate)
.wSecond = Second(inDate)
.wMilliseconds = 0
.wDayOfWeek = Weekday(inDate) - 1
End With
'【変換】システム時間→ファイル時間
Call SystemTimeToFileTime(udtSystemTime, otFileTime)
End Sub
Private Sub FileTime_To_Date(inFileTime As FILETIME, otDate As Date)
Dim udtSystemTime As SYSTEMTIME
'【変換】ファイル時間→システム時間
Call FileTimeToSystemTime(inFileTime, udtSystemTime)
'【変換】システム時間→日付
With udtSystemTime
otDate = .wYear & "/" & .wMonth & "/" & .wDay & " " & .wHour & ":" & .wMinute & ":" & .wSecond
End With
End Sub
開発環境で実行を確認できました。
したがって、不動の原因としては、予約語の間違いが考えられます。
自分では見つけられませんので、全部削除して、もう一度作り直してみます。
No.2
- 回答日時:
CreateFile→SetFileTime→CloseHandle
doevents← これをいれても駄目ですか?
CreateFile→GetFileTime→CloseHandle
だめでした。既に書いたとおりおそらくいつくかの変数名を私の好みに書き換えていることが原因です。
全削除2回・変数名を私の好みにかえないということで動作しました。おかげでブラックボックスのルーチンになってしまいました。
ただ他の少なくはない数のファイルの関係しているルーチンで正体不明のムシがファイルClose等ファイル取り扱い終了時に実行することで解決しました。
No.1
- 回答日時:
>SetFileTime でファイル時刻を変更した直後にタスクを終了することなく GetFileTime でファイル時刻を取得するとなぜか変更内容が破棄されます。
処理の流れは?
もちろんSetFileTime→CloseHandle→CreateFile→GetFileTimeですよね?
SetFileTime→CreateFile→GetFileTimeなんてしてないですよね?
明示的にバッファ内容を書き込ませるにはFlushFileBuffersです。
バッファの使用有無などはCreateFileのパラメータにもよります。
この回答への補足
>処理の流れは?
CreateFile→SetFileTime→CloseHandle
と
CreateFile→GetFileTime→CloseHandle
の2つのサブルーチンを呼び出しています。
>パラメータにもよります
関係定数を調べてみます。以前このサイトで教えていただいたガリバーのコピーなので大きな間違いはしていないと思います。しかし見本をサブルーチン化したときに変なことになっているかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- その他(コンピューター・テクノロジー) Power Shellコマンドで作成日時を一括シフトする方法 3 2022/10/21 12:37
- Windows 7 ショートカットキー 応用編 どういうの主に使いますか? 2 2022/12/28 23:46
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- Windows 7 Media Playerが開かない。ファイルアイコンを右クリックしても「プロパティ」が表示されない。 2 2023/02/05 14:45
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jarファイル
-
.NETアプリを作ったときの .man...
-
iPhoneでXMLファイルを開くには...
-
binファイルを解凍したいの...
-
公文書のxmlファイルの開き方が...
-
コマンドプロンプトで作成日時...
-
C言語---ファイルに出力したデ...
-
Latexで図番号だけを「図1.1」...
-
アクセス 壊れた? 「ファイ...
-
監視ツールを入れさせられまし...
-
既にファイルが開いているのな...
-
exeファイルの中身を見る方法は...
-
#include <Windows.h>というヘ...
-
ADODB.Streamで開いたファイル...
-
実行ファイル(.exeファイル)...
-
自分で作成した重要ファイルを...
-
CSSを1ページに1枚作るのって変...
-
参照するファイルをワイルドカ...
-
バッチ処理で追記コピーしたい
-
exeファイルをデータ転送サービ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
binファイルを解凍したいの...
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
.NETアプリを作ったときの .man...
-
#include <Windows.h>というヘ...
-
公文書のxmlファイルの開き方が...
-
Latexで図番号だけを「図1.1」...
-
jarファイル
-
Seasar2のdiconファイルの読み方
-
自分で作成した重要ファイルを...
-
C言語---ファイルに出力したデ...
-
コマンドプロンプトで、指定し...
-
ファイルが開かれているかどう...
-
exeファイルの中身を見る方法は...
-
リンクの張り付けかたを教えて...
-
VBAでのicsファイル変換
-
「ブルーファイル」と「グリー...
-
HTMLからのBATファイル実行
-
VBSが起動しない
-
CSSを1ページに1枚作るのって変...
おすすめ情報