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))); }
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))); }
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)); } } } }
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); }