private static async Task CreateEntryFromFileInfoAsync(this TarWriter writer, FileInfo fi, string entryName, CancellationToken cancellationToken) { var entry = new TarEntry { Name = entryName.Replace('\\', '/').TrimEnd('/'), AccessTime = fi.LastAccessTimeUtc, ModifiedTime = fi.LastWriteTimeUtc, Type = TarEntryType.File, Mode = Convert.ToInt32("644", 8), }; if (fi.Attributes.HasFlag(FileAttributes.Directory)) { entry.Type = TarEntryType.Directory; entry.Mode = Convert.ToInt32("755", 8); entry.Name += "/"; } else { entry.Length = fi.Length; } if (fi.Attributes.HasFlag(FileAttributes.ReadOnly)) { entry.Mode &= ~Convert.ToInt32("222", 8); } await writer.CreateEntryAsync(entry); if (!fi.Attributes.HasFlag(FileAttributes.Directory)) { using (var file = fi.OpenRead()) { const int bufferSize = 81920; // This is the documented default for CopyToAsync(). await file.CopyToAsync(writer.CurrentFile, bufferSize, cancellationToken); } } }
private static async Task CreateEntryFromFileInfoAsync(this TarWriter writer, FileInfo fi, string entryName) { var entry = new TarEntry { Name = entryName.Replace('\\', '/').TrimEnd('/'), AccessTime = fi.LastAccessTimeUtc, ModifiedTime = fi.LastWriteTimeUtc, Type = TarEntryType.File, Mode = Convert.ToInt32("644", 8), }; if (fi.Attributes.HasFlag(FileAttributes.Directory)) { entry.Type = TarEntryType.Directory; entry.Mode = Convert.ToInt32("755", 8); entry.Name += "/"; } else { entry.Length = fi.Length; } if (fi.Attributes.HasFlag(FileAttributes.ReadOnly)) { entry.Mode &= ~Convert.ToInt32("222", 8); } await writer.CreateEntryAsync(entry); if (!fi.Attributes.HasFlag(FileAttributes.Directory)) { using (var file = fi.OpenRead()) { await file.CopyToAsync(writer.CurrentFile); } } }