2011-12-15 3 views
7

Я делаю программу для A2 Computing, которая экспортирует большое количество данных. Мое распределение жесткого диска в локальной сети составляет около 50 МБ, поэтому это хороший кандидат для проверки ошибки «без дискового пространства».Свободное место на диске на сетевом диске в Delphi

В настоящее время, когда в программе заканчивается пробел, он выдает средний экспорт с ошибкой ввода-вывода 112. Я бы хотел заранее предупредить, если файл может превысить доступное пространство. Я знаю, насколько большой файл будет (в среднем, 24,8 байт на запись), поэтому мне нужно всего лишь выяснить, сколько свободного места.

Как я работаю на сетевом диске, с файловым путем, например \\qmcsan1\Cxxxxx$\filename.csv, как использовать функции, такие как DiskFree для вычисления свободного пространства? Любая такая функция также должна обрабатывать локальные диски, такие как C:/.

Любые идеи очень ценятся.

+3

См RRUZ ответ на этом SO нить [как к-получить полную дисковое пространство-из-окон-диск] (http://stackoverflow.com/questions/6383598/delphi-how-to -get-общее-дисковое пространство-из-окна-диска). Использует WMI и работает на удаленных компьютерах. –

+0

@LU RD, злоупотребление WMI - это действительно дрянной подход. Я предвижу случай, когда пользователь, которому разрешено использовать общий ресурс, не выполняет проверку привилегий WMI. – OnTheFly

+4

@LU RD Если пользователь может писать тома, то, по-видимому, они могут просто использовать Win32 API для получения свободного места, а не для WMI с большим весом. –

ответ

9

Один простой подход - вызвать функцию API GetDiskFreeSpaceEx.

К сожалению, эта функция неправильно объявлена ​​в блоке Windows Delphi, по крайней мере, она находится в 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. 
+0

Спасибо за это - похоже, она сработает. Только проблема в том, что я полный noob в Delphi. Я пытаюсь использовать GetDiskFreeSpaceEx (PWideChar (save_dialog.FileName), @freespace, nil, nil) ', но он никогда не сохраняет число в' freespace'. Любая идея почему? –

+0

Возможно, вы работаете в версии Delphi от ANSI. См. Мое обновление. Внесите изменения, описанные в моем заключительном абзаце, и назовите его так: 'GetDiskFreeSpaceEx (PChar (save_dialog.FileName), @freespace, nil, nil)'. Или @TLama тоже может быть прав. –

+0

... или просто используйте 'PChar', и он будет работать во всех версиях Delphi. – jpfollenius

Смежные вопросы