0

パスを使用してローカル マシンで使用可能なディスク容量を確認したい... これは無効なパラメータ エラーを示しています

    string pathroot = "C:\Program Files (x86)\Personal\movies "
    ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"pathroot");
    disk.Get();
    string freespace = Convert.ToString(disk["FreeSpace"]);
    return freespace;  

誰が間違いを教えてもらえますか?またはこれを行う他の方法はありますか?

4

2 に答える 2

3

使うだけDriveInfo.TotalFreeSpace

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        DriveInfo[] allDrives = DriveInfo.GetDrives();

        foreach (DriveInfo d in allDrives)
        {
            Console.WriteLine("Drive {0}", d.Name);
            Console.WriteLine("  File type: {0}", d.DriveType);
            if (d.IsReady == true)
            {
                Console.WriteLine("  Volume label: {0}", d.VolumeLabel);
                Console.WriteLine("  File system: {0}", d.DriveFormat);
                Console.WriteLine(
                    "  Available space to current user:{0, 15} bytes", 
                    d.AvailableFreeSpace);

                Console.WriteLine(
                    "  Total available space:          {0, 15} bytes",
                    d.TotalFreeSpace);

                Console.WriteLine(
                    "  Total size of drive:            {0, 15} bytes ",
                    d.TotalSize);
            }
        }
    }
}
于 2013-04-23T07:17:16.057 に答える
0

文字列:

"win32_logicaldisk.deviceid=\"pathroot"

エスケープされた二重引用符が 1 つだけ含まれています。私は専門家ではありませんが、次のようになると思います。

"win32_logicaldisk.deviceid=\"pathroot\""

ただし、実際には結果の WMI クエリに pathroot の値を含めていません。これを行うには、次のようなものを使用できます。

var query = string.Format("win32_logicaldisk.deviceid=\"{0}\"", pathroot);    
ManagementObject disk = new ManagementObject(query);

私はそれをテストしていませんが、「deviceid」はフルパスではなく「C:」の形式の文字列を想定しているため、これは機能しないと思います。次のようにフル パスからドライブ文字を取得します。

var driveLetter = System.IO.Path.GetPathRoot(pathroot);
var query = string.Format("win32_logicaldisk.deviceid=\"{0}\"", pathroot);    
ManagementObject disk = new ManagementObject(query);

ただし、UNC (ネットワーク共有) パスのドライブ領域を照会できる必要がある場合、このアプローチは機能しないことに注意してください。

最後に、パスを含むハードコーディングされた文字列はエスケープされません。たとえば、現在、\Program Files の \P は、リテラルの \P としてではなく、エスケープ シーケンスとして扱われています。文字列を @ でマークして、次のようにします。

string pathroot = @"C:\Program Files (x86)\Personal\movies"
于 2013-04-23T07:14:41.103 に答える