Получение размера (бесплатно, всего) дисковода Windows Mobile с использованием C # - PullRequest
0 голосов
/ 03 января 2009

Как узнать размер (бесплатно, всего) любого накопителя на телефоне Windows Mobile с помощью C #?

Мне нужно сделать это с кодом, запущенным на устройстве (не на подключенном ПК).

Ответы [ 2 ]

5 голосов
/ 03 января 2009

Я переписал ответ, основываясь на лучшем понимании вопроса, но не потеряв ни одного моего первоначального ответа для тех, кто нашел этот вопрос.

Получение размера из кода, работающего на устройстве

Ответ прост: P / Invoke GetDiskFreeSpaceEx напрямую ( пример здесь ) или используйте стороннюю библиотеку , которая сделает это за вас .

Я также собираюсь отредактировать сообщение, чтобы оно показалось, что мои предположения верны - измените их, чтобы они читались иначе, если вам нужно.

У вас есть определение P / Invoke. Это просто статический вызов метода. Вы положили это в классе. Примерно так:

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

Затем вы называете это (не знаю, что вы пытаетесь сделать со всеми своими вещами):

ulong GetDiskSize(string volumeName)
{
  ulong avail;
  ulong total;
  ulong totalfree;

  MyClass.GetDiskFreeSpaceEx(volumeName, out avail, out total, out totalFree);

  return total;
  // return others as desired
}

Тогда, чтобы использовать это, это что-то вроде этого:

ulong diskSize = GetDiskSize("\\Storage Card");

Получение размера из кода, работающего на ПК

Хотя устройство отображается в проводнике как «диск», оно не является диском. Расширение оболочки используется, чтобы оно появилось в Проводнике. Вы не можете использовать любые API-интерфейсы накопителя, в рамках или через P / Invoke, чтобы получить информацию об устройстве.

Если вам нужно получить информацию об устройстве, подключенном через ActiveSync (XP и более ранние версии) или WMDC (Vista), то у вас есть для использования Remote API или RAPI. Конкретным API является CeGetStoreInformation , но вам необходимо выполнить некоторую инициализацию, прежде чем вы сможете его вызвать.

RAPI слишком сложен для того, чтобы в нем можно было найти ответ, но он хорошо документирован в Интернете, и здесь есть готовая управляемая оболочка для него (бесплатный и с открытым исходным кодом) здесь . В этой библиотеке вы выполняете конкретный вызов RAPI.GetDeviceStoreInformation .

.
1 голос
/ 03 января 2009

Предполагая, что диск телефона смонтирован в Windows как обычный том (т. Е. В проводнике Windows есть буква диска), вы можете получить эту информацию, используя класс System.IO.DriveInfo .

Следующая проблема, конечно, будет состоять в том, чтобы определить, какую букву диска использовать, так как она будет отличаться практически на каждом ПК, к которому подключен телефон.

Несколько вариантов для этого:

  • Сканирование всех доступных дисков в системе на наличие специального файла, который гарантированно будет присутствовать на телефоне. Environment.GetLogicalDrives предоставит вам список всех доступных дисков в системе; некоторые из них могут быть съемными или иным образом недоступными, что может вызвать нежелательные побочные эффекты во время сканирования ...
  • Более продвинутым подходом будет перечисление всех доступных USB-устройств и поиск вашего телефона по его идентификатору производителя / устройства. Хотя эта статья CodeProject написана для несколько иной цели, должна указать вам правильное направление ...

И в случае, если вы хотите запустить свой код непосредственно на телефоне, а не на ПК, к которому он подключен (ваш вопрос на этом не разбирается ...), этот вопрос StackOverflow показывает, как для получения информации о свободном пространстве в Compact Framework.

РЕДАКТИРОВАТЬ , в ответ на уточнение, что «когда я использую DriveInfo и присваиваю ему символ диска, он дает мне размер локального диска« Мой диск C: », а не диск C, существующий на mobile ": диск C: телефона будет иметь другую букву диска (например, F :) на ПК, на котором он установлен - поэтому часть моего ответа говорит о поиске правильной буквы диска. Это, конечно, предполагает, что диск вашего телефона полностью доступен на главном ПК: в зависимости от модели телефона это может иметь место или не иметь место. Если нет, то запуск кода на вашем телефоне - единственное жизнеспособное решение для получения этой информации ...

...