none
「有効な Win32 FileTime ではありません。」の発生原因について RRS feed

  • 質問

  • お世話になります。

    「有効な Win32 FileTime ではありません。」というエラーの発生原因が分からず困っています。

    (開発環境)
    .NET Framework 4.5.1
    C#
    Windows 7 Enterprise 

    (実行環境)
    .NET Framework 4.5.1
    Windows Server 2008 Standard SP2

    作成したアプリケーションで出力しているログファイルによると、
    FileSystemInfoクラスのLastWriteTimeプロパティにアクセスした際に下記のExceptionが発生している事が分かりました。

    System.ArgumentOutOfRangeException: 有効な Win32 FileTime ではありません。
    パラメーター名:fileTime
       場所 System.DateTime.FromFileTimeUtc(Int64 fileTime)
       場所 System.IO.FileSystemInfo.get_LastWriteTimeUtc()
       場所 System.IO.FileSystemInfo.get_LastWriteTime()

    文字通りだとすると、読み込んだファイルの最終更新日が取得出来ない=ファイルが壊れているのかもしれない
    と考えていますが、開発環境ではうまく再現できていません。

    同様の事象を経験されたか、発生原因をご存知の方いらっしゃいましたらご教示頂けないでしょうか。

    このアプリケーションは、特定のフォルダ以下のファイルをリストアップし、ファイルパスと最終更新日時をDBに格納する
    という処理を行っています。

    既にお客様環境にて動作中のアプリケーションであり、かつ開発環境では再現させる事が出来てきません。
    どのファイルでエラーが起きているかはまだ分かっておらず、エラー発生時のファイルパスをログに出力するよう修正しているところです。


    • 編集済み rassy256 2018年10月17日 7:37
    2018年10月17日 7:10

回答

  • windowsのfiletime自体は、64bitで、±30000年の表現能力があるのですが、netのdatetimeはそこまでのはないのです。なので、たとえは、ファイルにAD10000とかの更新日がついてたりすると、そういう例外が飛んできたりします。

    jzkey

    • 回答としてマーク rassy256 2018年10月23日 0:52
    2018年10月19日 13:48

すべての返信

  • rassy256 さま よろしく。

    ざっと検索して関連がありそうなリンクを挙げて置きます。  ユーザープロファイル等の破損が原因のケースが多そうですが(?)。

    https://stackoverflow.com/questions/46342122/system-argumentoutofrangeexception-not-a-valid-win32-filetime

    https://social.technet.microsoft.com/Forums/en-US/a6cd0504-73bd-41c4-8c5f-466f3816e47f/getaduser-error-getaduser-not-a-valid-win32-filetime?forum=ITCG

    https://forums.asp.net/t/999913.aspx?Reading+AccountExpires+Property

    https://social.msdn.microsoft.com/Forums/en-US/home?searchTerm=not%20a%20valid%20win32%20filetime

    外部リンク化していません。 ご勘弁を。

    • 編集済み ShiroYuki_Mot 2018年10月17日 13:30 プロファイルにユーザーを挿入
    2018年10月17日 13:25
  • ShiroYuki_Mot様

    情報ありがとうございます。
    確認させて頂きます。

    2018年10月18日 0:22
  • ご記載の通り、ファイルが持つ日付情報が、破損している場合に起こるのでは?と思いました。
    壊れる事ってあるの?と思いましたが、あるのかもしれません。


    Not a valid Win32 FileTime. Parameter name: fileTime
    https://social.msdn.microsoft.com/Forums/en-US/08f5f26c-cf5d-442e-bb52-0a2dc4bad3d3/not-a-valid-win32-filetime-parameter-name-filetime?forum=msbuild
    ・エクスプローラ上で見ても、作成日・更新日の更新日時が表示されていない
    ・メモ帳などで上書き保存して日付情報を付けることで回避、またはそういうファイルは無視して飛ばす

    PowerShellとファイルの日付についてちょっとしたこと
    http://itasuke.hatenablog.com/entry/2017/12/14/161338
    ・無理やりファイルの日付を変更したら、現象再現できるかもしれません。

    • 編集済み sutefu7 2018年10月18日 3:56 質問内容の誤認に対する追記
    2018年10月18日 3:52
  • windowsのfiletime自体は、64bitで、±30000年の表現能力があるのですが、netのdatetimeはそこまでのはないのです。なので、たとえは、ファイルにAD10000とかの更新日がついてたりすると、そういう例外が飛んできたりします。

    jzkey

    • 回答としてマーク rassy256 2018年10月23日 0:52
    2018年10月19日 13:48
  • sutefu7 様

    情報ありがとうございます。
    無理やり更新日時を変更したら再現出来ました。

    ただ、PowerShellで変更できる範囲では再現せず、
    bashなどのコマンドを用いて強制的に30826/10/16などの有り得ない日付にしないとダメでした。

    エラーになっているファイルはWindowsではないマシンで作ったファイルだそうです。

    • 回答としてマーク rassy256 2018年10月23日 0:52
    • 回答としてマークされていない rassy256 2018年10月23日 0:52
    2018年10月23日 0:47
  • jzkey 様

    なるほど。Windowsと.NETで扱える範囲が異なるのですね。
    納得できる回答頂きありがとうございました。

    bashなどのコマンドで30826/10/16に変更すると再現出来ました。

    2018年10月23日 0:52