public void WriteTarFileTest() { using (Stream original = File.OpenRead(@"IO/test.tar")) using (Stream expected = File.OpenRead(@"IO/test.tar")) using (Stream actual = new MemoryStream()) using (Stream output = new ValidatingCompositeStream(null, actual, expected)) { var tar = new TarFile(original, true); while (tar.Read()) { Stream data = new MemoryStream(); if (tar.FileHeader.FileMode == LinuxFileMode.S_IFDIR) { tar.Skip(); } else { data = tar.Open(); } var clonedHeader = this.CloneHeader((TarHeader)tar.FileHeader); this.AssertCompareClonedHeader((TarHeader)tar.FileHeader, clonedHeader); using (data) { TarFileCreator.WriteEntry(output, this.CloneHeader(clonedHeader), data); } } TarFileCreator.WriteTrailer(output); } }
public void WriteTarWithLongFilenameTest() { using (Stream expected = File.OpenRead(@"IO/largefilename.tar")) using (Stream actual = new MemoryStream()) using (Stream output = new ValidatingCompositeStream(null, actual, expected)) { var directories = new string[] { "./", "./usr/", "./usr/lib/", "./usr/lib/mono/", "./usr/lib/mono/gac/", "./usr/lib/mono/gac/System.Runtime.InteropServices.RuntimeInformation/", "./usr/lib/mono/gac/System.Runtime.InteropServices.RuntimeInformation/4.0.0.0__b03f5f7f11d50a3a/", }; foreach (var directory in directories) { TarFileCreator.WriteEntry( output, new ArchiveEntry() { Mode = LinuxFileMode.S_IXOTH | LinuxFileMode.S_IROTH | LinuxFileMode.S_IXGRP | LinuxFileMode.S_IRGRP | LinuxFileMode.S_IXUSR | LinuxFileMode.S_IWUSR | LinuxFileMode.S_IRUSR | LinuxFileMode.S_IFDIR, TargetPath = directory, Group = "root", Owner = "root", Modified = new DateTimeOffset(2016, 12, 15, 10, 58, 56, TimeSpan.Zero) }, null); } using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes("This file has a very long name."))) { TarFileCreator.WriteEntry( output, new ArchiveEntry() { Mode = (LinuxFileMode)0x81FF, TargetPath = "./usr/lib/mono/gac/System.Runtime.InteropServices.RuntimeInformation/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.InteropServices.RuntimeInformation.txt", Modified = new DateTimeOffset(2017, 11, 11, 12, 37, 58, TimeSpan.Zero) }, stream); } TarFileCreator.WriteTrailer(output); } }
private static void WriteControlEntry(Stream tar, string name, string data = null, LinuxFileMode?fileMode = null) { var s = (data != null) ? new MemoryStream(Encoding.UTF8.GetBytes(data)) : new MemoryStream(); var mode = fileMode ?? LinuxFileMode.S_IRUSR | LinuxFileMode.S_IWUSR | LinuxFileMode.S_IRGRP | LinuxFileMode.S_IROTH; mode |= data == null ? LinuxFileMode.S_IFDIR | LinuxFileMode.S_IXUSR | LinuxFileMode.S_IXGRP | LinuxFileMode.S_IXOTH : LinuxFileMode.S_IFREG; var hdr = new TarHeader { FileMode = mode, FileName = name, FileSize = (uint)s.Length, GroupName = "root", UserName = "******", LastModified = DateTimeOffset.UtcNow, Magic = "ustar", TypeFlag = data == null ? TarTypeFlag.DirType : TarTypeFlag.RegType, }; TarFileCreator.WriteEntry(tar, hdr, s); }