0

メトロスタイルアプリを作成していますが、ユーザーの音楽ライブラリをホストするドライブの利用可能なストレージ容量を確認したいと思います。ディスクに空き容量がないか、ほとんどない状態で、一部のアプリ機能を無効にしたい。P / Invokeを使用してGetDiskFreeSpaceExWを呼び出し、エラーが発生し、有効なバイト数がありません。

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetDiskFreeSpaceExW(
   string lpDirectoryName,
   out ulong lpFreeBytesAvailable,
   out ulong lpTotalNumberOfBytes,
   out ulong lpTotalNumberOfFreeBytes
);

[DllImport("kernel32.dll", SetLastError = true)]
static extern int GetLastError();

async static void TestDiskSpace()
{
   IStorageFolder musicFolder = KnownFolders.MusicLibrary;
   IStorageFolder testFolder = await musicFolder.CreateFolderAsync("test", CreationCollisionOption.OpenIfExists);
   IStorageFolder appFolder = ApplicationData.Current.LocalFolder; 
   ulong a, b, c;
   string[] paths = new[]
   {
      null,
      "."
      "C:",
      "C:\\",
      "C:\\Users\\Jonas\\Music",
      "C:\\Users\\Jonas\\Music\\",
      musicFolder.Path,
      testFolder.Path,
      appFolder.Path
   };
   foreach(string path in paths)
   {
      GetDiskFreeSpaceExW(path, out a, out b, out c);
      int error = GetLastError();
      Debug.WriteLine(
         string.Format("{0} - Error {1} - free = {2}",
         path ?? "null", error, a));
   }
}

デバッグ出力:

null - Error 5 - free = 0
. - Error 123 - free = 0
C: - Error 3 - free = 0
C:\ - Error 3 - free = 0
C:\Users\J909\Music - Error 3 - free = 0
C:\Users\J909\Music\ - Error 3 - free = 0
 - Error 3 - free = 0
C:\Users\J909\Music\test - Error 123 - free = 0
C:\Users\J909\AppData\Local\Packages\long-app-id\LocalState - Error 123 - free = 0

間違った入力をしているようです。エラーコードは3:ERROR_PATH_NOT_FOUND、5:ERROR_ACCESS_DENIED、123:ERROR_INVALID_NAMEです。このコードは、Metroスタイルアプリから呼び出されたVS Ultimate2012RCを使用するWindows8RP(x64)で実行しています。私のアプリには、ユーザーの音楽ライブラリにアクセスするためのアクセス許可が付与されました。

誰かがMetroスタイルアプリ内からこの関数を正常に呼び出すことができましたか?空き領域の有効な読み取り値を生成するために、どのような種類のディレクトリ名が受け入れられますか?

4

2 に答える 2

4

I created the code in this question based on the Win32 and COM documentation for Metro. It calls out GetDiskFreeSpaceExW to be available in metro, but a managed app that uses P/Invoke needs to call GetDiskFreeSpaceEx instead:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetDiskFreeSpaceEx(
    string lpDirectoryName,
    out ulong lpFreeBytesAvailable,
    out ulong lpTotalNumberOfBytes,
    out ulong lpTotalNumberOfFreeBytes);

static void TestDiskSpace()
{
    IStorageFolder appFolder = ApplicationData.Current.LocalFolder;
    ulong a, b, c;
    if(GetDiskFreeSpaceEx(appFolder.Path, out a, out b, out c))
        Debug.WriteLine(string.Format("{0} bytes free", a));
}
于 2012-06-29T22:09:57.610 に答える
0

あなたはより良い運を持っているかもしれません

long free = new DriveInfo(driveName).TotalFreeSpace;
于 2012-06-21T07:04:29.583 に答える