C# P/Invoke GetDiskFreeSpaceEx

C# P/Invoke GetDiskFreeSpaceEx,c#,windows-mobile,compact-framework,C#,Windows Mobile,Compact Framework,的精确副本: 亲爱的所有人 我知道我的问题花了很多时间,很多人都帮了我,但我是C#的新手,这是我的第一份申请 现在我读了一篇文章: C#签名: [DllImport("coredll.dll", SetLastError=true, CharSet=CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,

的精确副本:
亲爱的所有人

我知道我的问题花了很多时间,很多人都帮了我,但我是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
  }
我在谷歌上搜索过,但我没有足够的经验知道正确的标签


thnx

基本上,您可以像调用其他静态方法一样调用它,在您的示例中,如下所示:

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();
}
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 diskSize = GetDiskSize("\\Storage Card");
我建议您创建一个包装器来处理异常的抛出(除非您希望每次都检查返回值而不处理异常):

然后,呼叫站点将变为:

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

您的原始代码确实令人困惑,您可以只使用上一个问题中链接的原始代码。事实上,你不应该在一开始就提出另一个问题,而应该在原文中添加一条评论,要求进一步澄清

您有一个p/Invoke定义。这只是一个静态方法调用。你把它放在课堂上。大概是这样的:

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();
}
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 diskSize = GetDiskSize("\\Storage Card");
然后您将其称为(不知道您正试图用所有封送处理的东西做什么):

然后使用它是这样的:

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();
}
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 diskSize = GetDiskSize("\\Storage Card");

InternalGetDiskFreeSpaceEx和GetDiskFreeSpaceEx之间有什么区别?函数“GetDiskFreeSpaceEx”有什么错误?!?标识符应该在哪里?它应该在哪里?!?不幸的是,我发现这个错误:无法加载DLL“coredll.DLL”:找不到指定的模块。(来自HRESULT的例外:0x8007007E)你知道那是什么吗?!?!你在设备上运行这个吗?我认为你没有给我们一个清晰的画面,你在做什么。这一定是一个智能设备应用程序(就像我在你最初的问题中猜测的那样),并且它一定在设备上运行。不知道你为什么要使用“InternalGetDIskFreeSpace”作为开始-它是一个别名,它们会导致难以检测的bug。除非你知道自己在做什么(显然你不知道),否则不要使用它们。你真的需要阅读P/Invoking。请看:还有更多。也许我对智能设备不太了解。简单地说,我的应用程序是一个桌面应用程序,它允许用户将一些文件从服务器复制到手机上,然后我想知道他们使用的内存大小(我在手机上阅读所有驱动器,并在树状视图上显示这些驱动器的内容)你应该在原始问题中明确这一点,而不是让它变得混乱,然后用相同的问题打开另一个问题。答案在我原始问题的原始答案中,在底部。这是一个自定义的RAPI DLL,你必须用C编写。看,亲爱的..我的问题是他没有看到DLL文件,我不知道怎么办…我读到了关于pInvoke的文章,但是接下来他怎么还没有看到dll文件呢?我不懂C语言,这是怎么回事?!有没有其他方法来获取我找到的大小ConaDefinition.CONA_get_Folder_Info2,但它也给了我错误