LoginSignup
1
0

More than 3 years have passed since last update.

NETCoreAppのFileInfoの不思議な挙動

Posted at

概要

NETCoreApp2.2でビルドするとFileInfoのCreationTimeやLastWriteTimeをいじる際にmacOS上では意図しない挙動になる。
NETCoreApp3.0でビルドすればマシな挙動になる。

検証環境

  • macOS 10.14.6
  • dotnet 3.0.100-preview7-012821

検証内容

以下のコードをそれぞれNETCoreApp2.2とNETCoreApp3.0をターゲットにビルド、実行して挙動の違いを確かめる。

Program.fs
open System.IO

let writeText path (text: string) =
    use stream = FileInfo(path).CreateText()
    stream.Write(text)

let editCreationTime path creationTime =
    let fi = FileInfo(path)
    fi.CreationTime <- creationTime

let editLastWriteTime path lastWriteTime =
    let fi = FileInfo(path)
    fi.LastWriteTime <- lastWriteTime

[<EntryPoint>]
let main _ =
    let path = Path.Combine(Directory.GetCurrentDirectory(), "foo bar.md")
    let text = "baz"
    let creationTime = System.DateTime.Parse("2010/12/24 12:30:24")
    let lastWriteTime = System.DateTime.Parse("2017/09/30 14:57:12")

    let printTimestamp title =
        let fi = FileInfo(path)
        printfn "%s" title
        printfn "Creation time: %A" fi.CreationTime
        printfn "Last write time: %A" fi.LastWriteTime
        printfn "--------------------"

    try
        writeText path text
        printTimestamp "After creating file"
        editCreationTime path creationTime
        printTimestamp "After editing creation time"
        editLastWriteTime path lastWriteTime
        printTimestamp "After editing last write time"
    finally
        File.Delete(path)

    0 // return an integer exit code

NETCoreApp2.2での挙動

After creating file
Creation time: 2019/08/13 12:49:21
Last write time: 2019/08/13 12:49:21
--------------------
After editing creation time
Creation time: 2019/08/13 12:49:21
Last write time: 2019/08/13 12:49:21
--------------------
After editing last write time
Creation time: 2017/09/30 14:57:12
Last write time: 2017/09/30
--------------------

CreationTimeを変更した際にはファイルの何も変更されない。
LastWriteTimeを変更した際にはファイルのLastWriteTimeとCreationTimeが変更される。

NETCoreApp3.0での挙動

After creating file
Creation time: 2019/08/13 12:53:11
Last write time: 2019/08/13 12:53:11
--------------------
After editing creation time
Creation time: 2010/12/24 12:30:24
Last write time: 2010/12/24 12:30:24
--------------------
After editing last write time
Creation time: 2010/12/24 12:30:24
Last write time: 2017/09/30 14:57:12
--------------------

CreationTimeを変更した際にはファイルのCreationTimeとLastWriteTimeが変更される。
LastWriteTimeを変更した際にはファイルのLastWriteTimeのみが変更される。

後書き

NETCoreApp3.0でもCreationTimeを変更した際にはCreationTimeだけ変更されるべきだとは思うが、NETCoreApp2.2の挙動に比べて随分マシな挙動だと個人的には思う。
IO周りの挙動はプラットフォームによって大きく異なると思うのでWindowsでの挙動はまた異なるのだろうと思う。

MSDNのNETCoreApp3.0の新機能の紹介やそこで紹介されている記事を見てもこの辺の挙動周りについて書いていなかった。
なにか参考になるものがあれば教えていただければ嬉しいです。

ここで用いたコードはGithubのレポジトリから確認できます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0