public void MakeSureYouCannotCreateVirtualDiskFromGarbage() { MemoryStream testStream = new MemoryStream(); testStream.Write(new byte[2048], 0, 2048); ExceptionAssert.MakeSureExceptionIsRaisedBy <VirtualDiskCreationFailedException>(delegate() { VirtualDisk.CreateFromStream(testStream); }); }
public void MakeSureVirtualDisksCorrectlyInitializeThemselvesFromSuitableStreams() { VirtualDiskWithItsStream virtualDiskConstructionResult = VirtualDiskTestFactory.ConstructDefaultTestDiskWithStream(); var virtualDisk = virtualDiskConstructionResult.Disk; Assert.AreEqual(VirtualDiskTestFactory.DefaultDiskBlockSize, virtualDisk.BlockSizeInBytes); Assert.AreEqual(VirtualDiskTestFactory.DefaultDiskSize, virtualDisk.DiskSizeInBytes); VirtualDisk diskRecreatedFromTheSameStream = VirtualDisk.CreateFromStream(virtualDiskConstructionResult.BackingStream); Assert.AreEqual(virtualDisk.BlockSizeInBytes, diskRecreatedFromTheSameStream.BlockSizeInBytes); Assert.AreEqual(VirtualDiskTestFactory.DefaultDiskSize, diskRecreatedFromTheSameStream.DiskSizeInBytes); }
public static VirtualFileSystem CreateFileSystemFromExistingStream(Stream stream) { if (stream == null) { throw new ArgumentNullException("stream"); } VirtualDisk disk = VirtualDisk.CreateFromStream(stream); var diskStructuresManager = new FileSystemNodeStorage(disk); FileSystemHeader header = diskStructuresManager.ReadFileSystemHeader(VirtualDiskFormatter.FileSystemHeaderBlockIndex); var nameValidator = FileSystemArtifactNamesValidator.Default; var pathValidator = PathValidator.Default; var pathBuilder = PathBuilder.Default; var nodeResolver = new NodeResolver(disk, diskStructuresManager, StringComparer.OrdinalIgnoreCase, header.RootBlockOffset, VirtualFileSystem.Root, VirtualFileSystem.DirectorySeparatorChar, pathValidator, pathBuilder); return(VirtualFileSystem.CreateFromDisk(disk, StringComparer.OrdinalIgnoreCase, nodeResolver, pathBuilder, nameValidator, pathValidator)); }
// Note: этот код специально прилеплен к и без того немаленькому VirtualFileSystem. Это повышает discoverability фабричных методов (по сравнению с выделением фабрики) и усиливает ограничения (private-конструктор против internal-конструктора). /// <summary> /// Создает виртуальную файловую систему с настройками по умолчанию, на основе указанного файла. /// </summary> /// <param name="fullPathForFile"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="FileSystemCreationFailedException"></exception> public static VirtualFileSystem OpenExisting(string fullPathForFile) { if (String.IsNullOrEmpty(fullPathForFile)) { throw new ArgumentNullException("fullPathForFile"); } FileStream stream = CreateStreamFromExistingFileWrappingExceptions(fullPathForFile); try { VirtualDisk disk = VirtualDisk.CreateFromStream(stream); var diskStructuresManager = new FileSystemNodeStorage(disk); FileSystemHeader header = diskStructuresManager.ReadFileSystemHeader(VirtualDiskFormatter.FileSystemHeaderBlockIndex); var nameValidator = FileSystemArtifactNamesValidator.Default; var pathValidator = PathValidator.Default; var pathBuilder = PathBuilder.Default; var nodeResolver = new NodeResolver(disk, diskStructuresManager, StringComparer.OrdinalIgnoreCase, header.RootBlockOffset, VirtualFileSystem.Root, VirtualFileSystem.DirectorySeparatorChar, pathValidator, pathBuilder); return(VirtualFileSystem.CreateFromDisk(disk, StringComparer.OrdinalIgnoreCase, nodeResolver, pathBuilder, nameValidator, pathValidator)); } catch (VirtualDiskCreationFailedException exception) { throw CreateGenericSystemCreationFromExistingFileException(exception, fullPathForFile); } catch (InconsistentDataDetectedException exception) { throw CreateGenericSystemCreationFromExistingFileException(exception, fullPathForFile); } }