private static void ApplyMetadata(string path, System.IO.Stream stream, bool restorePermissions) { using(var tr = new System.IO.StreamReader(stream)) using(var jr = new Newtonsoft.Json.JsonTextReader(tr)) { var metadata = new Newtonsoft.Json.JsonSerializer().Deserialize<Dictionary<string, string>>(jr); string k; long t; System.IO.FileAttributes fa; var isDirTarget = path.EndsWith(DIRSEP); var targetpath = isDirTarget ? path.Substring(0, path.Length - 1) : path; // Make the symlink first, otherwise we cannot apply metadata to it if (metadata.TryGetValue("CoreSymlinkTarget", out k)) m_systemIO.CreateSymlink(targetpath, k, isDirTarget); if (metadata.TryGetValue("CoreLastWritetime", out k) && long.TryParse(k, out t)) { if (isDirTarget) m_systemIO.DirectorySetLastWriteTimeUtc(targetpath, new DateTime(t, DateTimeKind.Utc)); else m_systemIO.FileSetLastWriteTimeUtc(targetpath, new DateTime(t, DateTimeKind.Utc)); } if (metadata.TryGetValue("CoreCreatetime", out k) && long.TryParse(k, out t)) { if (isDirTarget) m_systemIO.DirectorySetCreationTimeUtc(targetpath, new DateTime(t, DateTimeKind.Utc)); else m_systemIO.FileSetCreationTimeUtc(targetpath, new DateTime(t, DateTimeKind.Utc)); } if (metadata.TryGetValue("CoreAttributes", out k) && Enum.TryParse(k, true, out fa)) m_systemIO.SetFileAttributes(targetpath, fa); m_systemIO.SetMetadata(path, metadata, restorePermissions); } }