概要
NETCoreApp2.2でビルドするとFileInfoのCreationTimeやLastWriteTimeをいじる際にmacOS上では意図しない挙動になる。
NETCoreApp3.0でビルドすればマシな挙動になる。
検証環境
- macOS 10.14.6
- dotnet 3.0.100-preview7-012821
検証内容
以下のコードをそれぞれNETCoreApp2.2とNETCoreApp3.0をターゲットにビルド、実行して挙動の違いを確かめる。
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のレポジトリから確認できます。