2

C# で imdisk を介して RAM ディレクトリを作成しようとしています。cmd コマンドは次のようなものなので、
imdisk -a -s 512M -m X: -p "/fs:ntfs /q /y"
C# で cmd コマンドを処理する方法を調べたところ、ProcessStartInfo() に関するいくつかのヒントが見つかりました。このクラスは、ほぼ意図したとおりに機能しますが、imdisk には管理者権限が必要なため、ちょっと行き詰まっています。コード ブロックは例外なく実行されますが、Windows エクスプローラーに新しいデバイスが表示されません。

        try
        {
            string initializeDisk   = "imdisk -a ";
            string imdiskSize       = "-s 1024M ";
            string mountPoint       = "-m "+ MountPoint + " ";
            string formatHdd        = "-p '/fs:ntfs /q /y' ";

            SecureString password = new SecureString();
            password.AppendChar('0');
            password.AppendChar('8');
            password.AppendChar('1');
            password.AppendChar('5');
            ProcessStartInfo procStartInfo = new ProcessStartInfo();
            procStartInfo.UseShellExecute   = false;
            procStartInfo.CreateNoWindow    = true;
            procStartInfo.RedirectStandardError = true;
            procStartInfo.FileName          = "cmd";
            procStartInfo.Verb              = "runas";
            procStartInfo.UserName          = "Admin";
            procStartInfo.Password          = password;
            procStartInfo.Arguments         = initializeDisk + imdiskSize + mountPoint + formatHdd;
            Process.Start(procStartInfo);

        catch (Exception objException)
        {
            Console.WriteLine(objException);
        }

誰かが私にちょっとしたヒントをくれるといいのですが、今はアイデアがありません。

4

2 に答える 2

3

さて、私は別の方法で問題を解決しました。どういうわけか、imdisk が新しい RamDisk を本来の方法でフォーマットしなかったため、ディスクが作成されなかったようです。フォーマット オプションを削除するとすぐに、ディスクが作成され、フォーマットする必要があります。したがって、別のプロセスを開始し、cmd コマンド「format Drive:」を使用しました。

興味のある人のために、私の解決策は次のとおりです。

class RamDisk
{
    public const string MountPoint = "X:";

    public void createRamDisk()
    {

        try
        {
            string initializeDisk   = "imdisk -a ";
            string imdiskSize       = "-s 1024M ";
            string mountPoint       = "-m "+ MountPoint + " ";


            ProcessStartInfo procStartInfo  = new ProcessStartInfo();
            procStartInfo.UseShellExecute   = false;
            procStartInfo.CreateNoWindow    = true;
            procStartInfo.FileName          = "cmd";
            procStartInfo.Arguments         = "/C " + initializeDisk + imdiskSize + mountPoint;
            Process.Start(procStartInfo);

            formatRAMDisk();

        }
        catch (Exception objException)
        {
            Console.WriteLine("There was an Error, while trying to create a ramdisk! Do you have imdisk installed?");
            Console.WriteLine(objException);
        }

    }

    /**
     * since the format option with imdisk doesn't seem to work
     * use the fomat X: command via cmd
     * 
     * as I would say in german:
     * "Von hinten durch die Brust ins Auge"
     * **/
    private void formatRAMDisk(){

        string cmdFormatHDD = "format " + MountPoint + "/Q /FS:NTFS";

        SecureString password = new SecureString();
        password.AppendChar('0');
        password.AppendChar('8');
        password.AppendChar('1');
        password.AppendChar('5');

        ProcessStartInfo formatRAMDiskProcess   = new ProcessStartInfo();
        formatRAMDiskProcess.UseShellExecute    = false;
        formatRAMDiskProcess.CreateNoWindow     = true;
        formatRAMDiskProcess.RedirectStandardInput     = true;
        formatRAMDiskProcess.FileName           = "cmd";
        formatRAMDiskProcess.Verb               = "runas";
        formatRAMDiskProcess.UserName           = "Administrator";
        formatRAMDiskProcess.Password           = password;
        formatRAMDiskProcess.Arguments          = "/C " + cmdFormatHDD;
        Process process                         = Process.Start(formatRAMDiskProcess);

        sendCMDInput(process);
    }

    private void sendCMDInput(Process process)
    {
        StreamWriter inputWriter = process.StandardInput;
        inputWriter.WriteLine("J");
        inputWriter.Flush();
        inputWriter.WriteLine("RAMDisk for valueable data");
        inputWriter.Flush();
    }

    public string getMountPoint()
    {
        return MountPoint;
    }
}
于 2012-12-06T10:44:45.630 に答える
1

引数として渡されたコマンドを実行するには、cmd.exe に /C コマンド ライン オプションを渡す必要はありませんか? 引数の前に "/C" を追加していないため、cmd.exe は procStartInfo.Arguments で通過しているものを無視しているだけかもしれません。

于 2012-12-05T16:31:01.857 に答える