Delphi中网络驱动器上的可用磁盘空间

Delphi中网络驱动器上的可用磁盘空间,delphi,diskspace,Delphi,Diskspace,我正在为A2计算制作一个程序,该程序输出大量数据。我在本地网络上的HDD分配大约为50MB,因此它是测试“无磁盘空间”错误的一个很好的候选者 当前,当程序空间不足时,它会在中间导出时崩溃,并出现I/O错误112。如果文件可能超出可用空间,我希望提前发出警告。我知道文件有多大(平均每个记录24.8字节),所以我需要做的就是找出有多少可用空间 当我在网络驱动器上工作时,文件路径为\\qmcsan1\cxxx$\filename.csv,如何使用DiskFree等函数计算可用空间?任何此类函数还需要处

我正在为A2计算制作一个程序,该程序输出大量数据。我在本地网络上的HDD分配大约为50MB,因此它是测试“无磁盘空间”错误的一个很好的候选者

当前,当程序空间不足时,它会在中间导出时崩溃,并出现I/O错误112。如果文件可能超出可用空间,我希望提前发出警告。我知道文件有多大(平均每个记录24.8字节),所以我需要做的就是找出有多少可用空间

当我在网络驱动器上工作时,文件路径为
\\qmcsan1\cxxx$\filename.csv
,如何使用
DiskFree
等函数计算可用空间?任何此类函数还需要处理本地驱动器,如
C://


任何想法都值得赞赏。

一个简单的方法是调用API函数

不幸的是,这个函数在Delphi Windows单元中声明错误,至少在XE2中是这样。但是在SysUtils中声明了一个正确的版本。确保您使用该版本

program FreeDiskSpace;
{$APPTYPE CONSOLE}
uses
  SysUtils;

const
  Folder = 'C:\';

var
  FreeAvailable, TotalSpace: Int64;

begin
  if SysUtils.GetDiskFreeSpaceEx(PChar(Folder), FreeAvailable, TotalSpace, nil) then begin
    Writeln(TotalSpace div (1024*1024*1024), 'GB total');
    Writeln(FreeAvailable div (1024*1024*1024), 'GB free');
  end;
end.

请参阅此SO线程中的RRUZ答案。使用WMI并在远程计算机上工作。@LU RD如果用户能够写入卷,那么他们可能只需要使用Win32 API来获得可用空间,而不需要重型WMI。@user539484,
。WMI滥用确实是一种蹩脚的方法
,您现在知道系统中的哪个非常关键的进程(可能是正在保护您的计算机的防病毒程序)使用WMI吗?使用WMI获取远程(或共享)资源的大小是完全有效的。
…我预见到当授权使用共享的用户无法通过WMI权限检查时的情况。
,是的,这可能发生,因为对共享资源的访问与WMI所要求的不同,因此也可能发生相反的情况,即使未使用WMI共享,您也可以获取有关远程资源的信息。最后,很明显存在这样的任务:WinAPI是正确的工具(如访问本地资源),WMI是更好的选择。@RRUZ->“有多少关键系统服务和应用程序使用WMI”>我发现关键系统服务依赖WMI有点奇怪,然而,这项服务甚至可以因为任何原因而被禁用。谢谢你,看起来它可以工作了。唯一的问题是,我在德尔福是个十足的笨蛋。我正在尝试
GetDiskFreeSpaceEx(PWideChar(save_dialog.FileName),@freespace,nil,nil)
,但它从不在
freespace
中存储任何数字。知道为什么吗?你可能使用的是ANSI版本的Delphi。查看我的更新。进行我最后一段中描述的更改,并将其命名为:
GetDiskFreeSpaceEx(PChar(save_dialog.FileName),@freespace,nil,nil)
。或者@TLama也可能是正确的……或者只使用
PChar
,它在所有Delphi版本中都能工作。@Smasher不,它不会。您需要获得正确的导入,可以是
A
W
。如果Windows.pas中的声明是正确的,那就容易多了@大卫:对我来说,SysUtils中只有一个
GetDiskFreeSpaceEx
,这有什么不对?