Пример #1
0
        private void CreateVhdx(bool allowKeepDebug, long length)
        {
            var diskStream = CreateVhdxStream(allowKeepDebug);

            Disk = Disk.InitializeDynamic(diskStream, Ownership.Dispose, length, 128 << 20);
            var gpt = GuidPartitionTable.Initialize(Disk);

            gpt.Create(gpt.FirstUsableSector, gpt.LastUsableSector, GuidPartitionTypes.WindowsBasicData, 0, null);
            var  volume         = VolumeManager.GetPhysicalVolumes(Disk).First();
            uint bytesPerSector = (uint)(volume.PhysicalGeometry?.BytesPerSector ?? 512);
            var  clusterCount   = 1 << 25;
            var  clusterSize    = length / clusterCount;
            var  clusterBits    = (int)Math.Ceiling(Math.Log(clusterSize) / Math.Log(2));

            if (clusterBits > 18)
            {
                clusterBits = 18;
            }
            else if (clusterBits < 11)
            {
                clusterBits = 11;
            }
            FileSystem = ExFatEntryFilesystem.Format(volume.Open(),
                                                     new ExFatFormatOptions {
                SectorsPerCluster = (1u << clusterBits) / bytesPerSector
            });
        }
 public void ReadFile()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx())
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var files = filesystem.EnumerateFileSystemEntries(filesystem.RootDirectory).ToArray();
             Assert.IsTrue(files.Any(f => f.Name == DiskContent.LongContiguousFileName));
         }
 }
Пример #3
0
 public void FindFile()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx())
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var file = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             Assert.IsNotNull(file);
         }
 }
Пример #4
0
 public void MoveFileTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var aFile   = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             var aFolder = filesystem.FindChild(filesystem.RootDirectory, DiskContent.EmptyRootFolderFileName);
             filesystem.Move(aFile, aFolder, "noob");
         }
     }
 }
Пример #5
0
 public void DeleteDirectoryTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var f = filesystem.FindChild(filesystem.RootDirectory, DiskContent.EmptyRootFolderFileName);
             filesystem.Delete(f);
             Assert.IsNull(filesystem.FindChild(filesystem.RootDirectory, DiskContent.EmptyRootFolderFileName));
         }
     }
 }
Пример #6
0
 public void CreateSubDirectoryTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var s1 = filesystem.CreateDirectory(filesystem.RootDirectory, "SubOne");
             var n2 = "SubTwo";
             var s2 = filesystem.CreateDirectory(s1, n2);
             var f2 = filesystem.FindChild(s1, n2);
             Assert.IsNotNull(f2);
         }
     }
 }
Пример #7
0
 public void CreateDirectoryTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var directoryName = "Orphaaaan 1";
             var s1            = filesystem.CreateDirectory(filesystem.RootDirectory, directoryName);
             var f1            = filesystem.FindChild(filesystem.RootDirectory, directoryName);
             // do more checks?
             Assert.IsNotNull(f1);
         }
     }
 }
Пример #8
0
 public void UpdateLastAccessTime()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx())
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var file    = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             var access0 = file.LastAccessTime;
             using (var stream = filesystem.OpenFile(file, FileAccess.Read))
             {
             }
             var access1 = file.LastAccessTime;
             Assert.IsTrue(access1 > access0);
             var file2   = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             var access2 = file2.LastAccessTime;
             Assert.AreEqual(access1, access2);
         }
 }
Пример #9
0
 public void ReadFile()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx())
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var file = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             var vb   = new byte[sizeof(ulong)];
             using (var stream = filesystem.OpenFile(file, FileAccess.Read))
             {
                 for (ulong offset = 0; offset < DiskContent.LongFileSize; offset += 8)
                 {
                     stream.Read(vb, 0, vb.Length);
                     var v = LittleEndian.ToUInt64(vb);
                     Assert.AreEqual(v, DiskContent.GetLongContiguousFileNameOffsetValue(offset));
                 }
             }
         }
 }
Пример #10
0
        public void CreateEmptyFileTest()
        {
            using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
            {
                using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
                {
                    using (var s = filesystem.CreateFile(filesystem.RootDirectory, "a.txt"))
                    {
                    }

                    var f = filesystem.FindChild(filesystem.RootDirectory, "a.txt");
                    using (var s2 = filesystem.OpenFile(f, FileAccess.Read))
                    {
                        Assert.AreEqual(-1, s2.ReadByte());
                    }
                }
            }
        }
Пример #11
0
 public void RandomReadWriteTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var testFolder   = filesystem.CreateDirectory(filesystem.RootDirectory, "inner looping test");
             var random       = new Random(0);
             var fileIndex    = 0;
             var catalogCache = new List <string>();
             for (int loop = 0; loop < 10; loop++)
             {
                 // delete some
                 var existingFiles = filesystem.EnumerateFileSystemEntries(testFolder).ToArray();
                 for (int index = 0; index < existingFiles.Length; index++)
                 {
                     if (random.Next(0, 2) == 0)
                     {
                         filesystem.Delete(existingFiles[index]);
                         Assert.IsTrue(catalogCache.Remove(existingFiles[index].Name));
                     }
                 }
                 // add some
                 var newFilesCount = random.Next(100, 300);
                 for (int index = 0; index < newFilesCount; index++)
                 {
                     ++fileIndex;
                     var fileName = fileIndex.ToString();
                     using (var s = filesystem.CreateFile(testFolder, fileName))
                     {
                         var l = random.Next(0, 1000);
                         var b = BitConverter.GetBytes(fileIndex);
                         for (int i = 0; i < l; i++)
                         {
                             s.Write(b, 0, b.Length);
                         }
                     }
                     catalogCache.Add(fileName);
                 }
             }
         }
     }
 }
Пример #12
0
 public void LengthenFileTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             using (var s = filesystem.CreateFile(filesystem.RootDirectory, "newlong"))
             {
                 var length = 200000;
                 s.SetLength(length);
                 s.Seek(-1, SeekOrigin.End);
                 s.WriteByte(12);
                 Assert.AreEqual(length, s.Length);
                 s.WriteByte(34);
                 Assert.AreEqual(length + 1, s.Length);
             }
         }
     }
 }
Пример #13
0
 public void AppendTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var file = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             using (var s = filesystem.OpenFile(file, FileAccess.ReadWrite))
             {
                 s.Seek(0, SeekOrigin.End);
                 s.WriteByte(123);
             }
             Assert.AreEqual(file.Length, (long)DiskContent.LongFileSize + 1);
             using (var s2 = filesystem.OpenFile(file, FileAccess.Read))
             {
                 s2.Seek(-1, SeekOrigin.End);
                 Assert.AreEqual(123, s2.ReadByte());
                 Assert.AreEqual(-1, s2.ReadByte());
             }
         }
 }
Пример #14
0
 public void TruncateFileTest()
 {
     using (var testEnvironment = StreamTestEnvironment.FromExistingVhdx(true))
     {
         using (var filesystem = new ExFatEntryFilesystem(testEnvironment.PartitionStream))
         {
             var f = filesystem.FindChild(filesystem.RootDirectory, DiskContent.LongContiguousFileName);
             using (var s = filesystem.OpenFile(f, FileAccess.ReadWrite))
             {
                 s.SetLength(16);
                 s.Seek(0, SeekOrigin.Begin);
                 var b = new byte[8];
                 Assert.AreEqual(8, s.Read(b, 0, b.Length));
                 Assert.AreEqual(DiskContent.GetLongContiguousFileNameOffsetValue(0), LittleEndian.ToUInt64(b));
                 Assert.AreEqual(8, s.Read(b, 0, b.Length));
                 Assert.AreEqual(DiskContent.GetLongContiguousFileNameOffsetValue(8), LittleEndian.ToUInt64(b));
                 Assert.AreEqual(0, s.Read(b, 0, b.Length));
             }
         }
     }
 }