Esempio n. 1
0
        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);
                        }
        }
Esempio n. 2
0
        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);
                    }
        }
Esempio n. 3
0
        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);
        }