DiscUtils создает NTFS VHD - PullRequest
       36

DiscUtils создает NTFS VHD

0 голосов
/ 19 февраля 2019

Я пытаюсь создать виртуальный жесткий диск с NTFS в .NET Core.

Я обнаружил пакет DiscUtils NuGet и пример кода на их странице GitHub отлично работает для созданияVHD с форматом FAT.

long diskSize = 30 * 1024 * 1024; //30MB
using (Stream vhdStream = File.Create(@"C:\TEMP\mydisk.vhd"))
{
    Disk disk = Disk.InitializeDynamic(vhdStream, diskSize);
    BiosPartitionTable.Initialize(disk, WellKnownPartitionType.WindowsFat);
    using (FatFileSystem fs = FatFileSystem.FormatPartition(disk, 0, null))
    {
        fs.CreateDirectory(@"TestDir\CHILD");
        // do other things with the file system...
    }
}

Но для моего случая использования мне нужны файлы размером более 2 ГБ.Поскольку мы все равно используем Windows, NTFS в порядке.Поэтому я попробовал этот код

long diskSize = 300 * 1024 * 1024; //300 MB
var vhdPath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "vhd"));

using (Stream vhdStream = File.Create(vhdPath))
{
    var disk = DiscUtils.Vhd.Disk.InitializeFixed(vhdStream, Ownership.None, diskSize);
    BiosPartitionTable.Initialize(disk, WellKnownPartitionType.WindowsNtfs);
    using (var ntfs = NtfsFileSystem.Format(vhdStream, "Virtual NTFS drive", Geometry.FromCapacity(diskSize), 0, diskSize / Sizes.Sector))
    {
        ntfs.CreateDirectory(@"TestDir\CHILD");

        // do other things with the file system...
    }
}

Этот код создает виртуальный жесткий диск объемом 300 МБ, который я могу открыть с помощью 7zip, но он содержит файл ~ 300 МБ * .mbr.Если я попытаюсь открыть, откроется новое окно 7zip в папке Temp.Если я дважды блокирую этот VHD, я получаю сообщение об ошибке Windows: «Образ диска не инициализирован, содержит нераспознанные разделы или тома, которые не были назначены букве диска. Используйте оснастку« Управление диском », чтобы убедиться, что диск, разделы иобъемы в рабочем состоянии ".(свободно переводится с немецкого)

После этого я больше не могу получить доступ к файлу, потому что какой-то процесс Windows все еще держит его занятым.

Что я здесь неправильно понимаю?

Есть ли другой способ создания / подключения виртуальных жестких дисков с помощью C # и .NET Core?

1 Ответ

0 голосов
/ 21 февраля 2019

Я получил ответ от EricZimmerman о проектах Страница GitHub :

var diskSize = 2000 * 1024 * 1024;
var asVhd = false;

using (var fs = new FileStream(_vhfxFileName, FileMode.OpenOrCreate))
{
    VirtualDisk destDisk = Disk.InitializeDynamic(fs, Ownership.None, diskSize);

    if (asVhd)
    {
        destDisk = DiscUtils.Vhd.Disk.InitializeDynamic(fs, Ownership.None, diskSize);
    }

    BiosPartitionTable.Initialize(destDisk, WellKnownPartitionType.WindowsNtfs);
    var volMgr = new VolumeManager(destDisk);

    var label = $"ZZZZZZ ({dateStamp})";

    using (var destNtfs = NtfsFileSystem.Format(volMgr.GetLogicalVolumes()[0], label, new NtfsFormatOptions()))
    {
        destNtfs.NtfsOptions.ShortNameCreation = ShortFileNameOption.Disabled;

        var destDirectory = Path.GetDirectoryName(@"Some file");
        destNtfs.CreateDirectory(destDirectory, nfo);

        using (Stream source = new FileStream(@"Some file2", FileMode.Open, FileAccess.Read))
        {
            var destFileName = @"foo";

            using (Stream dest = destNtfs.OpenFile(destFileName, FileMode.Create, FileAccess.ReadWrite))
            {

                source.CopyTo(dest);
                dest.Flush();
            }
        }
        //do more stuff here
    }

    //commit everything to the stream before closing
    fs.Flush();
}

Работает для меня!Наслаждайтесь:)

...