2012-12-05 39 views
1

我想通過在C#中的imdisk創建一個RAM目錄。由於cmd命令是這樣的:
imdisk -a -s 512M -m X: -p "/fs:ntfs /q /y"
我查找了如何使用C#處理cmd命令,並發現了有關ProcessStartInfo()的幾個提示。這個類的工作方式幾乎和我打算的一樣,但是由於imdisk需要管理員權限,所以我有點被卡住了。即使代碼塊沒有例外地執行,我也沒有在Windows資源管理器中看到任何新設備。如何使用imdisk和C#創建RAM磁盤?

 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); 
     } 

我希望有人能給我一點提示,現在我沒有想法。

+0

好,因爲C#應該開始CMD第一,通過控制檯命令來啓動imdisk ,這似乎是正確的做法。但即使我嘗試了你的建議,也沒有什麼改變。 –

+0

@RobertSchröder相當粗魯,甚至不贊成我的答案時,至少部分是正確的。我不會再回答你的任何問題。 –

+0

@JackHughes:我最誠摯的道歉,我希望我沒有多少讓你失望。由於我對StackOverflow非常陌生(我昨天加入),我不知道所有的功能或習俗。希望你能原諒我缺乏禮貌。 PS:我只是想給你一些互聯網點,但我似乎需要15分才能投票。 –

回答

1

不CMD.EXE必須經過的/ C命令行選項來運行命令穿過作爲參數?可能是因爲你沒有在參數的前面添加「/ C」,cmd.exe只是忽略了你在procStartInfo.Arguments中傳遞的內容。

+0

謝謝,這是我的代碼中至少有一個錯誤。現在我可以在cmd窗口中看到正確的字符串,但該設備仍未創建。 –

2

那麼我以不同的方式解決了我的問題。不知何故,似乎imdisk沒有按照它應該的方式格式化新的RamDisk,因此沒有創建磁盤。一旦我刪除格式化選項,磁盤就會被創建並需要格式化。因此,我開始另一個進程,並使用cmd命令「格式驅動器:」

對於任何人誰是有興趣的,我的解決方案如下:

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; 
    } 
} 
+0

好的一段代碼謝謝。 BTW格式選項在使用時正在工作:imdisk -a -s 512M -m X:-p「/ fs:ntfs/q/y」 – Martin

+0

'-p「...」'只有在調用可執行文件正在運行時'管理員'權限 – Loathing

相關問題