2

特定の操作を続行するかどうかを条件付きで判断するために、Windows CE デバイスの空き容量を判断する必要があります。

ここでのケン・ブランコの答え( yonderの例と非常によく似ています)がうまくいくと思いました。

internal static bool EnoughStorageSpace(long spaceNeeded)
{
    DriveInfo[] allDrives = DriveInfo.GetDrives();
    long freeSpace = 0;
    foreach (DriveInfo di in allDrives)
    {
        if (di.IsReady)
        {
            freeSpace = di.AvailableFreeSpace;
        }
    }
    return freeSpace >= spaceNeeded;
}

...しかし、DriveInfoは、私の Windows CE/コンパクト フレームワーク プロジェクトでは利用できません。

私は mscorlib を参照しており、System.IO を使用していますが、DriveInfo はエディターでカンザスシティ チーフスのジャージよりも赤いため、私には利用できないと思います。

同じことを達成する別の方法はありますか?

アップデート

私はこれを適応させました:

[DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);

public static bool EnoughStorageSpace(ulong freespaceNeeded)
{
    String folderName = "C:\\";
    ulong freespace = 0;
    if (string.IsNullOrEmpty(folderName))
    {
        throw new ArgumentNullException("folderName");
    }    

    ulong free, dummy1, dummy2;

    if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2))
    {
        freespace = free;
    }
    return freespace >= freespaceNeeded;
}

...from here、これはコンパイルされますが、Windows CE デバイスの "folderName" がどうあるべきかわかりません。Windows エクスプローラーでは、名前がまったくありません。私が今持っているもの(「C:\」)は正しくないと確信しています...

更新 2

ここの「Windowsプログラマー」によると:「Windows CEを実行している場合、\はルートディレクトリです

だから、私は使用する必要があります:

String folderName = "\";

...またはエスケープする必要がありますか:

String folderName = "\\";

...また...???

4

1 に答える 1

4

Windows CE API ドキュメントでは、関数の使用方法について説明しています: http://msdn.microsoft.com/en-us/library/ms890887.aspx

lpディレクトリ名

[in] 指定したディスク上のディレクトリを指定する null で終わる文字列へのポインター。この文字列は、汎用命名規則 (UNC) 名にすることができます。

lpDirectoryName が NULL の場合、GetDiskFreeSpaceEx 関数はオブジェクト ストアに関する情報を取得します。注 lpDirectoryName は、ディスク上のルート ディレクトリを指定する必要はありません。この関数は、ディスク上の任意のディレクトリを受け入れます。

Windows CE はドライブ文字を使用しません。代わりに、ファイル システムは統合されたツリーであり、Linux のように、実際には存在しないディレクトリで構成されるか、親ディレクトリのサブディレクトリが異なる物理ボリューム (またはおそらく従来のボリュームでさえありません。CE は、ROM および RAM ボリュームを従来のフラッシュ ストレージとマージすることをサポートしており、すべて同じファイル システム ツリー内にあります)。

デバイスに複数のボリュームが 1 つのツリーに結合されていると仮定すると、アプリケーションのディレクトリは 1 つのボリューム上にあり、関心のあるのはこのボリュームであると想定できます。その場合、次のコードが適しています。

String executingFileName = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase;
String executingDirectory = System.IO.Path.GetDirectoryName( executingFileName );

UInt64 userFreeBytes, totalDiskBytes, totalFreeBytes;
if( GetDiskFreeSpaceEx( executingDirectory, out userFreeBytes, out totalDiskBytes, totalFreeBytes ) {
    // `userFreeBytes` is the number of bytes available for your program to write to on the mounted volume that contains your application code.
}
于 2015-01-15T19:59:25.873 に答える