Как создать простой том из нераспределенного раздела - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь открыть место на жестком диске для хранения некоторых файлов лицензий.

До сих пор я пробовал diskpart.Это выглядит простым в использовании, но я не смог отформатировать нераспределенный раздел с помощью diskpart.Я нашел способ создать нераспределенное пространство, но мне нужно отформатировать его для использования (поправьте меня, если я ошибаюсь. Я действительно новичок в работе с разделами диска)

Это мой метод выбораправильный объемЯ взял это отсюда, и это работает хорошо.Ссылка: C # и diskpart: как выбрать по метке диска, а не по номеру? и код, который я использую, таков:

public int GetIndexOfDrive(string drive)
{
    drive = drive.Replace(":", "").Replace(@"\", "");

    // execute DiskPart programatically
    Process process = new Process();
    process.StartInfo.FileName = "diskpart.exe";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.Start();
    process.StandardInput.WriteLine("list volume");
    process.StandardInput.WriteLine("exit");
    string output = process.StandardOutput.ReadToEnd();
    process.WaitForExit();

    // extract information from output
    string table = output.Split(new string[] { "DISKPART>" },         StringSplitOptions.None)[1];
    var rows = table.Split(new string[] { "\n" }, StringSplitOptions.None);
    for (int i = 3; i < rows.Length; i++)
    {
        if (rows[i].Contains("Volume"))
        {
            int index = Int32.Parse(rows[i].Split(new string[] { " " }, StringSplitOptions.None)[3]);
            string label = rows[i].Split(new string[] { " " }, StringSplitOptions.None)[8];

            if (label.Equals(drive))
            {
                return index;
            }
        }
    }

    return -1;
}

как только я получу индекс, я запускаю свойсобственный код для сжатия выбранного тома с этим кодом:

Process DiskPartProc = new Process();                                  
DiskPartProc.StartInfo.CreateNoWindow = true;
DiskPartProc.StartInfo.UseShellExecute = false;                        
DiskPartProc.StartInfo.RedirectStandardOutput = true;                  
DiskPartProc.StartInfo.FileName = @"C:\Windows\System32\diskpart.exe"; 
DiskPartProc.StartInfo.RedirectStandardInput = true;                   
DiskPartProc.Start();
DiskPartProc.StandardInput.WriteLine("select volume "+index);
DiskPartProc.StandardInput.WriteLine("shrink desired=16 minimum=16");
DiskPartProc.StandardInput.WriteLine("exit");                          
string output = DiskPartProc.StandardOutput.ReadToEnd();               
DiskPartProc.WaitForExit();

Как только я это сделаю, результат будет следующим:

http://prntscr.com/mjwg0t (только изображение нераспределенного раздела)

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

1 Ответ

0 голосов
/ 11 апреля 2019

Я решил свою проблему.Это мой окончательный код:

int index = GetIndexOfDrive(Path.GetPathRoot(@"E:\"));

Process DiskPartProc = new Process();
DiskPartProc.StartInfo.CreateNoWindow = true;
DiskPartProc.StartInfo.UseShellExecute = false;
DiskPartProc.StartInfo.RedirectStandardOutput = true;
DiskPartProc.StartInfo.FileName = @"C:\Windows\System32\diskpart.exe";
DiskPartProc.StartInfo.RedirectStandardInput = true;
DiskPartProc.Start();
DiskPartProc.StandardInput.WriteLine("select volume " + index);
DiskPartProc.StandardInput.WriteLine("shrink desired=16 minimum=16");
DiskPartProc.StandardInput.WriteLine("create partition primary size=16");
DiskPartProc.StandardInput.WriteLine("format fs=ntfs label=\"MyPlace\" quick");
DiskPartProc.StandardInput.WriteLine("exit");
string output = DiskPartProc.StandardOutput.ReadToEnd();
DiskPartProc.WaitForExit();

Проблема была в моем собственном диске.Я поставил еще один запасной и провел на нем весь свой тест, и он отлично работает, теперь я могу создать том диска внутри диска и отформатировать его, а затем получить к нему доступ с помощью идентификатора тома.Я все еще должен найти способ сделать это в C #.Я могу сделать последнюю часть из окон еще не из C #.Мне нужен способ получить доступ к этому объему сейчас.Я попробовал Directory.Exist, но это не сработало.

РЕДАКТИРОВАТЬ: Я нашел способ проверить.Поскольку я поместил только 1 файл и ничего больше в томе, я использую этот код:

Process MountProc = new Process();
            MountProc.StartInfo.CreateNoWindow = true;
            MountProc.StartInfo.UseShellExecute = false;
            MountProc.StartInfo.RedirectStandardOutput = true;
            MountProc.StartInfo.FileName = "mountvol";
            MountProc.StartInfo.RedirectStandardInput = true;
            MountProc.Start();
            MountProc.StandardInput.WriteLine("mountvol");
            MountProc.StandardInput.WriteLine("exit");
            string MountOutput = MountProc.StandardOutput.ReadToEnd();
            MountProc.WaitForExit();

            string VolumeGUID = string.Empty;
            List<string> VolList = MountOutput.Split(new string[] { "Possible values for VolumeName along with current mount points are:" }, StringSplitOptions.None)[1].Split('\n').Where(x => x != "\r").Where(x => x != "").ToList();
            List<string> ClearList = VolList.Select(s => s.Trim().Replace("\r", "")).ToList();
            for (int i = 0; i < ClearList.Count; i++)
            {
                if (ClearList[i].StartsWith(@"\\?\Volume") && ClearList[i + 1].StartsWith("***")) 
                {
                    string tmpPath = ClearList[i].Replace(@"\\?\", @"\\.\");
                    if (Directory.Exists(tmpPath))
                    {
                        string[] DirectoryList = Directory.GetDirectories(tmpPath, "*.*", SearchOption.TopDirectoryOnly);
                        string[] FileList = Directory.GetFiles(tmpPath, "*.*", SearchOption.TopDirectoryOnly);

                        if(DirectoryList.Length==0 && FileList.Length==1)
                        {
                            if (Path.GetExtension(FileList[0]) == ".license") 
                            {
                                Console.WriteLine("\n\n\n\t\rLicense file found in : " + FileList[0]);
                                File.Copy(FileList[0], "LIC.license", true);
                                Console.WriteLine("\n\t\rContent of license file : " + File.ReadAllText("LIC.license"));
                                File.Delete("LIC.license");
                            }
                        }
                    }
                }
            }
            Console.ReadKey();

Причина, по которой я скопировал файл в другое место и открыл его там, не могу открыть его с помощью класса Fileесли к нему обращаются по его идентификатору (например, \. \ Volume {UNIQUE_ID} \)

...