Как я могу определить свободное место на устройстве Windows CE?

Мне нужно определить, сколько свободного места есть на устройстве Windows CE, чтобы условно определить, следует ли продолжать конкретную операцию.

Я думал, что ответ Кена Бланко здесь (который имеет поразительное сходство с примером там) будет работать, что я адаптировал как:

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 / compact framework.

Я ссылаюсь на mscorlib и использую System.IO, но поскольку DriveInfo в моем редакторе краснее майки Kansas City Chiefs, я считаю, что она мне недоступна.

Есть ли альтернативный способ сделать то же самое?

ОБНОВИТЬ

Я адаптировал это:

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

... из здесь, который компилируется, но я не знаю, что такое имя папки "должно быть для устройства Windows CE; в проводнике Windows у него вообще нет имени. Я уверен, что то, что у меня сейчас ("C: \"), не то ...

ОБНОВЛЕНИЕ 2

Согласно "Windows-программисту" здесь: «Если вы используете Windows CE, тогда \ - это корневой каталог "

Итак, следует ли мне использовать:

String folderName = "\";

... или мне нужно его избежать:

String folderName = "\\";

...or...???


person B. Clay Shannon    schedule 15.01.2015    source источник
comment
\ для хранилища объектов. Что-то вроде \ Storage Card или \ USB Disk для подключенного носителя.   -  person ctacke    schedule 15.01.2015
comment
Хорошо спасибо; так что мне нужно избежать этого (folderName = \\;) или достаточно одного удара?   -  person B. Clay Shannon    schedule 15.01.2015
comment
Это строка. Вы должны избегать этого, как обычные правила для строк, чтобы вы могли сделать "\\" или @"\"   -  person ctacke    schedule 16.01.2015


Ответы (1)


В документации Windows CE API объясняется, как использовать эту функцию: http://msdn.microsoft.com/en-us/library/ms890887.aspx

lpDirectoryName

[in] Указатель на строку с завершающим нулем, которая указывает каталог на указанном диске. Эта строка может быть именем в соответствии с универсальным соглашением об именах (UNC).

Если lpDirectoryName имеет значение NULL, функция GetDiskFreeSpaceEx получает информацию о хранилище объектов. Примечание. LpDirectoryName не обязательно указывать корневой каталог на диске. Функция принимает любой каталог на диске.

Windows CE не использует буквы дисков, вместо этого файловая система представляет собой единое дерево, которое, как и в Linux, может состоять из каталогов, которые на самом деле не существуют, или где подкаталоги родительского каталога могут существовать на разных физических томах (или возможно, даже не традиционные тома: CE поддерживает объединение томов ПЗУ и ОЗУ с традиционными флэш-хранилищами в одном дереве файловой системы).

Предполагая, что ваше устройство имеет несколько томов, объединенных в одно дерево, мы все же можем предположить, что каталог вашего приложения будет на одном томе, и именно этот том вас интересует, и в этом случае вам подойдет этот код:

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.
}
person Dai    schedule 15.01.2015
comment
MainModule неразрешим. - person B. Clay Shannon; 15.01.2015
comment
@ B.ClayShannon Я изменил первую строку, чтобы использовать версию, которая должна работать в Windows CE. - person Dai; 15.01.2015