P / Invoke GetDiskFreeSpaceEx - PullRequest
       13

P / Invoke GetDiskFreeSpaceEx

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

Точная копия: Получение размера (бесплатно, всего) дисковода Windows Mobile с помощью c #


дорогие все;

я знаю, что моя проблема заняла много времени, и многие из вас помогли мне, но я новичок в C #, и это мое первое приложение ..

Теперь я читаю статью:

C # Подпись:

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

Пример кода:

   ulong FreeBytesAvailable;
   ulong TotalNumberOfBytes;
   ulong TotalNumberOfFreeBytes;

   bool success = GetDiskFreeSpaceEx("C:\\", out FreeBytesAvailable, out  
                                    TotalNumberOfBytes,out TotalNumberOfFreeBytes);
   if (!success)
         throw new System.ComponentModel.Win32Exception();

   Console.WriteLine("Free Bytes Available:      {0,15:D}", FreeBytesAvailable);
   Console.WriteLine("Total Number Of Bytes:     {0,15:D}", TotalNumberOfBytes);
   Console.WriteLine("Total Number Of FreeBytes: {0,15:D}", TotalNumberOfFreeBytes);

Теперь, как использовать эту функцию GetDiskFreeSpaceEx, и я должен добавить C # подпись куда-нибудь?!? а как насчет coredll.dll?!?

мой код такой:

  FolderInfo = (CONADefinitions.CONAPI_FOLDER_INFO)Marshal.PtrToStructure(Buffer,     
                                      typeof(CONADefinitions.CONAPI_FOLDER_INFO));
  if (FolderInfo.pstrName[0].ToString() != "C" && level == 0) 
  {
      // here i want to get the Total Size of the currentDirectory and freeSize
      // i want them in Bytes
  }

Я искал в Google, но у меня недостаточно опыта, чтобы узнать правильный тег

Thnx

Ответы [ 2 ]

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

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

FolderInfo = (CONADefinitions.CONAPI_FOLDER_INFO)Marshal.PtrToStructure(Buffer, typeof(CONADefinitions.CONAPI_FOLDER_INFO));
if (FolderInfo.pstrName[0].ToString() != "C" && level == 0) 
{
  ulong FreeBytesAvailable;
  ulong TotalNumberOfBytes;
  ulong TotalNumberOfFreeBytes;

  bool success = GetDiskFreeSpaceEx("C:\\", out FreeBytesAvailable, out TotalNumberOfBytes,out TotalNumberOfFreeBytes);

  if (!success)
    throw new System.ComponentModel.Win32Exception();
}

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

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

static GetDiskFreeSpaceEx(string directoryName, out ulong freeBytesAvailable, out ulong totalNumberOfBytes, out totalNumberOfFreeBytes);
{
  if (!GetDiskFreeSpaceEx(directoryName, out freeBytesAvailable, out totalNumberOfBytes, out totalNumberOfFreeBytes))
    throw new System.ComponentModel.Win32Exception();
}

Тогда сайт вызова станет:

FolderInfo = (CONADefinitions.CONAPI_FOLDER_INFO)Marshal.PtrToStructure(Buffer, typeof(CONADefinitions.CONAPI_FOLDER_INFO));
if (FolderInfo.pstrName[0].ToString() != "C" && level == 0) 
{
  ulong FreeBytesAvailable;
  ulong TotalNumberOfBytes;
  ulong TotalNumberOfFreeBytes;

  GetDiskFreeSpaceEx("C:\\", out FreeBytesAvailable, out TotalNumberOfBytes,out TotalNumberOfFreeBytes);
}
0 голосов
/ 03 января 2009

Ваш оригинальный код действительно сбивает с толку, вы можете просто использовать оригинальный код, связанный с предыдущим вопросом оригинальный вопрос здесь . На самом деле, вы не должны были сначала открывать другой вопрос, но должны были добавить комментарий в оригинале с просьбой дать дополнительные разъяснения.

У вас есть определение 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");
...