Setting the lastWriteTime And LastAccessTime no longer drops any ticks i.e granularit...
authorAnirudh Agnihotry <anirudhagnihotry098@gmail.com>
Fri, 14 Sep 2018 04:43:26 +0000 (21:43 -0700)
committerGitHub <noreply@github.com>
Fri, 14 Sep 2018 04:43:26 +0000 (21:43 -0700)
* nanoseconds granularity

* overflow corrected

Commit migrated from https://github.com/dotnet/corefx/commit/9b2965074a2bd7787e82968bb80398aa4818b30a

src/libraries/System.IO.FileSystem/src/System/IO/FileStatus.Unix.cs
src/libraries/System.IO.FileSystem/tests/File/GetSetTimes.cs

index 2606fea..3105898 100644 (file)
@@ -204,7 +204,10 @@ namespace System.IO
             Span<Interop.Sys.TimeSpec> buf = stackalloc Interop.Sys.TimeSpec[2];
 
             long seconds = time.ToUnixTimeSeconds();
-            long nanoseconds = (time.ToUnixTimeMilliseconds() - seconds * 1000) * 1_000_000;
+
+            const long TicksPerMillisecond = 10000;
+            const long TicksPerSecond = TicksPerMillisecond * 1000;
+            long nanoseconds = (time.UtcDateTime.Ticks - DateTimeOffset.UnixEpoch.Ticks - seconds * TicksPerSecond) * NanosecondsPerTick;
 
             if (isAccessTime)
             {
index 7adeaf1..d29e8f2 100644 (file)
@@ -108,6 +108,35 @@ namespace System.IO.Tests
             Assert.True(firstFileTicks <= secondFileTicks, $"First File Ticks\t{firstFileTicks}\nSecond File Ticks\t{secondFileTicks}");
         }
 
+        [ConditionalFact(nameof(isNotHFS))] // OSX HFS driver format does not support nanosecond granularity.
+        public void SetUptoNanoseconds()
+        {
+            string file = GetTestFilePath();
+            File.WriteAllText(file, "");
+
+            DateTime dateTime = DateTime.UtcNow;
+            File.SetLastWriteTimeUtc(file, dateTime);
+            long ticks = File.GetLastWriteTimeUtc(file).Ticks;
+
+            Assert.Equal(dateTime, File.GetLastWriteTimeUtc(file));
+            Assert.Equal(ticks, dateTime.Ticks);
+        }
+
+        [Fact]
+        [PlatformSpecific(~TestPlatforms.OSX)] // OSX has the limitation of setting upto 2262-04-11T23:47:16 (long.Max) date.
+        public void SetDateTimeMax()
+        {
+            string file = GetTestFilePath();
+            File.WriteAllText(file, "");
+
+            DateTime dateTime = new DateTime(9999, 4, 11, 23, 47, 17, 21, DateTimeKind.Utc);
+            File.SetLastWriteTimeUtc(file, dateTime);
+            long ticks = File.GetLastWriteTimeUtc(file).Ticks;
+
+            Assert.Equal(dateTime, File.GetLastWriteTimeUtc(file));
+            Assert.Equal(ticks, dateTime.Ticks);
+        }
+
         [Fact]
         public void SetLastAccessTimeTicks()
         {