Пример #1
0
        public void CanEnumerateSingleFileCabinet()
        {
            var cabinetPath = TestData.Get(@"TestData\test.cab");

            var cabinet = new Cabinet(cabinetPath);
            var files   = cabinet.Enumerate();

            var file = files.Single();

            Assert.Equal("test.txt", file.FileId);
            Assert.Equal(17, file.Size);

            Assert.Equal(19259, file.Date);
            Assert.Equal(47731, file.Time);
            Assert.True(file.SameAsDateTime(new DateTime(2017, 9, 28, 0, 19, 38)));
        }
Пример #2
0
        public void CanEnumerateSingleFileCabinet()
        {
            var cabinetPath = TestData.Get(@"TestData\test.cab");

            var cabinet = new Cabinet(cabinetPath);
            var files   = cabinet.Enumerate();

            var file = files.Single();

            Assert.Equal("test.txt", file.FileId);
            Assert.Equal(17, file.Size);

            Assert.Equal(19259, file.Date);
            Assert.Equal(47731, file.Time);
            // TODO: This doesn't seem to always pass, not clear why but it'd be good to understand one day.
            // Assert.True(file.SameAsDateTime(new DateTime(2017, 9, 28, 0, 19, 38)));
        }
Пример #3
0
        public void IntegrationTest()
        {
            using (var fs = new DisposableFileSystem())
            {
                var intermediateFolder = fs.GetFolder(true);
                var cabinetPath        = Path.Combine(intermediateFolder, "testout.cab");
                var extractFolder      = fs.GetFolder(true);

                // Compress.
                {
                    var files = new[] {
                        new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test1.txt"),
                        new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test2.txt"),
                    };

                    var cabinet = new Cabinet(cabinetPath);
                    cabinet.Compress(files, CompressionLevel.Low);
                }

                // Extract.
                {
                    var cabinet       = new Cabinet(cabinetPath);
                    var reportedFiles = cabinet.Extract(extractFolder);
                    Assert.Equal(2, reportedFiles.Count());
                }

                // Enumerate to compare cabinet to extracted files.
                {
                    var cabinet    = new Cabinet(cabinetPath);
                    var enumerated = cabinet.Enumerate().OrderBy(f => f.FileId).ToArray();

                    var files = Directory.EnumerateFiles(extractFolder).OrderBy(f => f).ToArray();

                    for (var i = 0; i < enumerated.Length; ++i)
                    {
                        var cabFileInfo = enumerated[i];
                        var fileInfo    = new FileInfo(files[i]);

                        Assert.Equal(cabFileInfo.FileId, fileInfo.Name);
                        Assert.Equal(cabFileInfo.Size, fileInfo.Length);
                        Assert.True(cabFileInfo.SameAsDateTime(fileInfo.CreationTime));
                    }
                }
            }
        }
Пример #4
0
        public IResolvedCabinet ResolveCabinet(string cabinetPath, IEnumerable <IFileFacade> fileFacades)
        {
            var filesWithPath = fileFacades.Select(this.CreateBindFileWithPath).ToList();

            IResolvedCabinet resolved = null;

            foreach (var extension in this.BackendExtensions)
            {
                resolved = extension.ResolveCabinet(cabinetPath, filesWithPath);

                if (null != resolved)
                {
                    return(resolved);
                }
            }

            // By default cabinet should be built and moved to the suggested location.
            resolved             = this.ServiceProvider.GetService <IResolvedCabinet>();
            resolved.BuildOption = CabinetBuildOption.BuildAndMove;
            resolved.Path        = cabinetPath;

            // If a cabinet cache path was provided, change the location for the cabinet
            // to be built to and check if there is a cabinet that can be reused.
            if (!String.IsNullOrEmpty(this.CabCachePath))
            {
                var cabinetName = Path.GetFileName(cabinetPath);
                resolved.Path = Path.Combine(this.CabCachePath, cabinetName);

                if (CheckFileExists(resolved.Path))
                {
                    // Assume that none of the following are true:
                    // 1. any files are added or removed
                    // 2. order of files changed or names changed
                    // 3. modified time changed
                    var cabinetValid = true;

                    var cabinet  = new Cabinet(resolved.Path);
                    var fileList = cabinet.Enumerate();

                    if (filesWithPath.Count() != fileList.Count)
                    {
                        cabinetValid = false;
                    }
                    else
                    {
                        var i = 0;
                        foreach (var file in filesWithPath)
                        {
                            // First check that the file identifiers match because that is quick and easy.
                            var cabFileInfo = fileList[i];
                            cabinetValid = (cabFileInfo.FileId == file.Id);
                            if (cabinetValid)
                            {
                                // Still valid so ensure the file sizes are the same.
                                var fileInfo = new FileInfo(file.Path);
                                cabinetValid = (cabFileInfo.Size == fileInfo.Length);
                                if (cabinetValid)
                                {
                                    // Still valid so ensure the source time stamp hasn't changed.
                                    cabinetValid = cabFileInfo.SameAsDateTime(fileInfo.LastWriteTime);
                                }
                            }

                            if (!cabinetValid)
                            {
                                break;
                            }

                            i++;
                        }
                    }

                    resolved.BuildOption = cabinetValid ? CabinetBuildOption.Copy : CabinetBuildOption.BuildAndCopy;
                }
            }

            return(resolved);
        }