• ベストアンサー

ファイル時刻の変更直後の時刻取得

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

aramananto
質問者

お礼

開発環境で実行を確認できました。 したがって、不動の原因としては、予約語の間違いが考えられます。 自分では見つけられませんので、全部削除して、もう一度作り直してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

CreateFile→SetFileTime→CloseHandle doevents ← これをいれても駄目ですか? CreateFile→GetFileTime→CloseHandle

aramananto
質問者

お礼

だめでした。既に書いたとおりおそらくいつくかの変数名を私の好みに書き換えていることが原因です。 全削除2回・変数名を私の好みにかえないということで動作しました。おかげでブラックボックスのルーチンになってしまいました。 ただ他の少なくはない数のファイルの関係しているルーチンで正体不明のムシがファイルClose等ファイル取り扱い終了時に実行することで解決しました。

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>SetFileTime でファイル時刻を変更した直後にタスクを終了することなく GetFileTime でファイル時刻を取得するとなぜか変更内容が破棄されます。 処理の流れは? もちろんSetFileTime→CloseHandle→CreateFile→GetFileTimeですよね? SetFileTime→CreateFile→GetFileTimeなんてしてないですよね? 明示的にバッファ内容を書き込ませるにはFlushFileBuffersです。 バッファの使用有無などはCreateFileのパラメータにもよります。

aramananto
質問者

補足

>処理の流れは? CreateFile→SetFileTime→CloseHandle と CreateFile→GetFileTime→CloseHandle の2つのサブルーチンを呼び出しています。 >パラメータにもよります 関係定数を調べてみます。以前このサイトで教えていただいたガリバーのコピーなので大きな間違いはしていないと思います。しかし見本をサブルーチン化したときに変なことになっているかもしれません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルのアクセス時刻について

    statコマンド(stat file_name.c)でファイルのアクセス時刻、更新時刻、変更時刻を調べているのですが、ファイルの内容をcatで参照したりemacsでファイルを開いてみてもアクセス時刻が変更されていません。 また、ファイルの内容(中の文章)を変更した場合はアクセス時刻、更新時刻、変更時刻の全てが変更されています。 ファイルの内容を読み込んだときはいつでもアクセス時刻が変更されるものだと思っていたのですが違うのでしょうか? 参考となる情報などありましたらご回答よろしくお願いいたします。

  • 日付と時刻のプロパティを制限する

    質問No.1852361と同じです。 WindowsXP Homeで、時刻の変更をできなくしたいのです。 ご回答内容は、timedate.cplのファイル名を変更とありました。これを実行しましたが、同名のファイルが作成され、目的は達成されませんでした。 宜しくお願いします。

  • PCの時刻合わせについて

    VBでPCの時刻を定期的に任意の時刻に変えたいです。 VBの実行ファイルを作成しタスクに登録してやることで対応しようと考えてます。 (標準時刻に合わせるのならフリーソフトを使用するのですが、標準時刻とは限らないため) VBでPCの時刻を合わせることは可能だと思いいろいろ調べているのですが、なかなかうまくいきません。 こういったことは可能でしょうか? また参考になるHPなどでも構いませんので分かるかたがおられましたら

  • 撮影日付、時刻でのファイル名変更

    撮影日付、時刻でのファイル名変更 SONY PC350(ヨン様CM)を所有しております。 パソコンはWindows7 動画をパソコンの読み取り保存した後にファイル名を撮影日付、撮影時刻に変更したいのですがその様なソフトはあるでしょうか? 現在はパソコン繋ぐと自動で読み取りAVI形式で保存されます その時に日付はファイル名になるのですが時刻は×です それとAVIだと綺麗じゃないのでMPEGで保存しときたいのですが その様なソフトもあるでしょうか? よろしくお願いします。

  • ファイルを閉じても開いているといわれる

    windows7を使っています。 officeは2007です。 wordなどoffice系のファイルを開いて作業をし、いったん閉じてから(プログラム終了) そのファイルのファイル名を変更したり、ディレクトリを変更したりしようとしたときに、 「ファイルは開かれているため、操作を完了できません。 ファイルを閉じてから再実行してください。」 というダイアログが出るときが度々あります。 ファイルは閉じているし、タスクマネージャーを見ても、プログラムは終了されています。 再起動をすれば問題なく作業ができるようになるのですが、 いちいち立ち上げ直すのも煩わしく、時間の無題になっています。 こういった場合、どう対処すればいいのでしょうか。

  • バッチファイルからメール作成&自動送信

    できるかわからないのですが、バッチファイルを作成して、それをタスクで自動起動しています。その起動結果をログファイルとして残し、そのログファイルをタスクが正常終了した時のみ、タスクを設定しているマシーンにメールで、添付なりリンクをはるなりして、送付したようなシステムを構築したいと思っています。それをバッチファイルに組み込みたいと思っているのですが、実現可能でしょうか?ちなみに、バッチファイルの内容は、db2コマンドの実行及びjavaファイルの実行です。 環境はwin2000です。

  • 一般ユーザーアカウントで時刻同期するには?

    はじめて質問させていただきます。 Windows7 Pro SP1 環境の一般ユーザーアカウントのクライアントPCにて、サーバ(インターネットには接続されていないネットワーク)との時刻同期を取りたいと考えています。 net time コマンドにてスケジュールで時刻同期を取るバッチファイルを作成しましたが、管理者権限がない為時刻の変更が反映されません。 いろいろ調べて、グループポリシーにてユーザーアカウント制御を有効にし、バッチファイルを実行するたびにユーザーアカウントの制御画面で管理者権限のパスワードを入力すれば時刻の変更が反映されるとこまではできるようになりました。 ですが、ユーザーアカウントの制御画面を表示させずに、管理者権限でバッチファイルを実行させたいのですが、その方法がわからずにこちらに質問させていただきました。 上記の要件でバッチファイルを実行させることはできないのか、またはできるのであればその方法を教えていただきたいと思います。 宜しくお願い致します。

  • Visual Basic 6.0における起動ファイル名(絶対パス)の取得方法

    MS-dos(PC-9801用) では、Int 2f 1902(INT 23, 24を含む)等を直接参照することで command.com の所在がわかり、また、特定の作業領域を直接参照することで起動時のコマンドを取得できます。 ここから、絶対パスが取得できる場合もありますが、相対パスの使用、Path環境変数の使用等でできない場合でも起動タスクの環境変数領域を参照することで、起動タスクがどのような状態で外部記憶装置に保存されているかが参照できました。 これらは、DEF SEG, PEEK の使用を前提としていますが、Visual Basic では関係情報がありません。Visual Basic での取得方法をお知らせください。 Visual C++6 等 Visual Studio 6.0 に含まれる言語でもかまいませんが、MS-Basic からの移植が現在の主体なので、Visual Basic から参照するために必要な参照情報に関する内容もお知らせください。VC関係の場合は、ヘルプファイル名と適当なキーワードをお知らせ願えれば幸いです。

  • フォルダ下のファイル内容の取得

    こんにちは。 指定したフォルダに入っているファイルやフォルダの情報を取得するには どんな関数を使えばいいのでしょうか? OSはwindows(98) 開発環境はvisual stdio C++です。 どうかよろしくお願いします。

  • 現在時刻を取得してファイル名にする

    いつもお世話になっています。 コマンドプロンプトから処理を実行し、その結果をログファイルとして残すバッチファイルを作成しています。 ログファイルを日付で管理したいので、ファイル名を "バッチファイル名_yyyymmdd.LOG"としたいのですが この"yyyymmdd"の部分で詰まってしまいました。 set NowDate=%date% set FileName=C:\temp\sample_%NowDate% としてみましたが、NowDateが"月 2003/07/28"となり、"/"のために ファイルが作成されませんでした。 %time%も":"が入ってしまうため、同様に作成されません。 バッチファイル内でyyyymmddを毎回記述し直せば楽なのでしょうが、 最終的にはタスクスケジュールに入れてしまいたいのでそれもできません。 どうしたら現在日をファイル名にすることができるのでしょうか? 御存知の方、教えてください。