powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RAD Studio 10.2 и Linux
19 сообщений из 19, страница 1 из 1
RAD Studio 10.2 и Linux
    #39597089
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Столкнулся со следующей проблемой:
в Windows, чтобы посмотреть объем диска и свободное пространство, используется DiskSize и DiskFree, а как посмотреть объем диска в Linux? Облазил весь интернет - ничего не нашел. Может у кого-то есть дока по взаимодействию приложений с linux?

Использую Embarcadero® Delphi 10.2 Version 25.0.26309.314
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597092
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подсмотреть как сделано во Free Pascal?
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597096
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azarenko,

statvfs из clib: https://searchcode.com/codesearch/view/6418530/

Вызываешь statvfs('Путь', адрес_буфера), смотришь на значения полей в буфере.

Буфер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct statvfs {
    unsigned long  f_bsize;    /* filesystem block size */
    unsigned long  f_frsize;   /* fragment size */
    fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
    fsblkcnt_t     f_bfree;    /* # free blocks */
    fsblkcnt_t     f_bavail;   /* # free blocks for unprivileged users */
    fsfilcnt_t     f_files;    /* # inodes */
    fsfilcnt_t     f_ffree;    /* # free inodes */
    fsfilcnt_t     f_favail;   /* # free inodes for unprivileged users */
    unsigned long  f_fsid;     /* filesystem ID */
    unsigned long  f_flag;     /* mount flags */
    unsigned long  f_namemax;  /* maximum filename length */
};



Результат будет в stat.f_bsize * stat.f_bavail
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597110
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД, а без C никак не обойтись?
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597114
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, если ты не можешь перевести structure в дельфийский рекорд - то никак, да.
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597126
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azarenko,

сама структура буфера и типы данных fsblkcnt_t и fsfilcnt_t в структуре буфера зависят от целевой системы.

Например, структура буфера может выглядеть и так:

Реальный пример
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
const
  _FSTYPSZ = 16;


type
  fsblkcnt_t = int64;
  fsfilcnt_t = int64;
  
  statvfs_t = packed record
    f_bsize : cardinal;                {* fundamental file system block size *}
    f_frsize : cardinal;               {* fragment size *}
    f_blocks : fsblkcnt_t;             {* total blocks of f_frsize on fs *} 
    f_bfree : fsblkcnt_t;              {* total free blocks of f_frsize *}   
    f_bavail : fsblkcnt_t;             {* free blocks avail to non-superuser *}
    f_files : fsfilcnt_t;              {* total file nodes (inodes) *}
    f_free : fsfilcnt_t;               {* total free file nodes *}
    f_favail : fsfilcnt_t;             {* free nodes avail to non-superuser *}
    f_fsid :  cardinal;                {* file system id (dev for now) *}
    f_basetype : array[0.._FSTYPSZ-1] of char; {* target fs type name null terminated *}
    f_flag : cardinal;                 {* bit-mask of flags *} 
    f_namemax : cardinal;              {* maximum file name length *}
    f_filler : array[1..21] of cardinal; {* reserved for future expansion *} 
  end;  
  
function sys_statvfs(const path: pchar; var buf : statvfs_t): cint; cdecl; external name 'statvfs';  



Т.е., тебе все же следует разобраться, что у тебя за система, посмотреть на используемую библиотеку cdelc и т.п.

Вполне возможно, что в Delphi все эта шняга уже "завернута" в какие-нибудь DiskSize/DiskFree.
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597157
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД, спасибо, завтра попробую!

p.s.: нашел интересную реализацию, но она для mac os (используется Posix.SysSysctl):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function MemSize : Int64;
var
  mib : array[0..1] of Integer;
  res : Integer;
  len : size_t;
begin
 mib[0] := CTL_HW;
 mib[1] := HW_MEMSIZE;

 len := sizeof(Result);
 res := sysctl(@mib, Length(mib), @Result, @len, nil, 0);
 if res <> 0 then RaiseLastOSError;
end;
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597162
Фотография Leonid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azarenkoкак посмотреть объем диска в Linux?
Использую Embarcadero® Delphi 10.2 Version 25.0.26309.314
Не претендую на идеально-правильное решение, но у себя в библиотеке для разных платформ реализовал так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
{$IFDEF MSWINDOWS}
function DiskFreeEx(const aDir: string): Int64;
var
  Drive: String;
  DChar: AnsiChar;
begin
  Result := 0;
  Drive := System.SysUtils.ExtractFileDrive(aDir).ToUpper;
  if Drive <> '' then
  begin
    DChar := AnsiChar(Drive[Low(Drive)]);
    if DChar in ['A'..'Z'] then
      Result := DiskFree(Ord(DChar) - $40)
  end;
end;
{$ENDIF}

{$IF Defined(POSIX) and not Defined(ANDROID)}
function DiskFreeEx(const aDir: string): Int64;
var
  Bt: TBytes;
  StatBuf: _statvfs;
begin
  Bt := TEncoding.ANSI.GetBytes(aDir);
  Bt := Bt + [0];

  if statvfs(MarshaledAString(Bt), StatBuf) = 0 then
    Result := StatBuf.f_bavail * StatBuf.f_bsize
  else
    raise EInOutError.CreateFmt('Unable to get free size for "%s"', [aDir]);
end;
{$ENDIF}

{$IFDEF ANDROID}
//statvfs do not defined for Android in SysStatvfsAPI.inc
//Therefore we use statfs.
//Check SysStatvfsAPI.inc in future release.
type
  __statfs = record
    f_type,
    f_bsize: LongWord;
    f_blocks,
    f_bfree,
    f_bavail,
    f_files,
    f_ffree,
    f_fsid,
    f_namelen,
    f_frsize,
    f_flags: UInt64;
    f_spare: packed array[0..4-1] of UInt64;
  end;

function _statfs(__file: MarshaledAString; var __buf: __statfs): Integer; cdecl; external libc name _PU + 'statfs';

function DiskFreeEx(aDir: string): Int64;
var
  Bt: TBytes;
  StatBuf: __statfs;
begin
  Bt := TEncoding.ANSI.GetBytes(aDir);
  Bt := Bt + [0];

  if _statfs(MarshaledAString(Bt), StatBuf) = 0 then
    Result := StatBuf.f_bavail * StatBuf.f_bsize
  else
    raise EInOutError.CreateFmt('Unable to get free size for "%s"', [aDir]);
end;
{$ENDIF}
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597403
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
azarenko, пардон, так мы смотрим объем ОЗУ
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597404
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid, спасибо, попробую!
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597673
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azarenko,

Быстрый беглый поиск дал ссылку:

http://forum.lazarus.freepascal.org/index.php?topic=19439.0

Код: pascal
1.
WriteLn('DiskFree '+inttostr(DiskFree(AddDisk('/home/v1'))));
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39597679
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon, да, натыкался на это, но DiskFree и AddDisk нет в Embarcadero® Delphi 10.2 для Linux
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #39671661
azarenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!
Решение следующее:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function POSIXDiskSize(const dir: string; method: integer): Int64;
var
  Bt: TBytes;
  StatBuf: _statvfs;
begin
  Bt := TEncoding.ANSI.GetBytes(dir);
  Bt := Bt + [0];
  if statvfs(MarshaledAString(Bt), StatBuf) = 0 then
    //1 = full size, 2 = free size
    case method of
      1: Result := Round(StatBuf.f_blocks * StatBuf.f_bsize / sqr(1024));
      2: Result := Round(StatBuf.f_bavail * StatBuf.f_bsize / sqr(1024));
    end
  else
    raise EInOutError.CreateFmt('Unable to get size for "%s" (method %d)', [dir, method]);
end;


В Uses дописываем System.Math, Posix.SysStatvfs

P.S. Прошу прощения за долгий ответ :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
RAD Studio 10.2 и Linux
    #40045893
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azarenko,

благодарю! забрал себе, нужно для делфи как раз )
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #40046093
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
System.Math только ради того, чтобы возвести в квадрат (!) константу (!!) *лицорука*
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #40046876
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
System.Math только ради того, чтобы возвести в квадрат (!) константу (!!) *лицорука*

я это вообще выбросил ) мне в байтах надо. ну и в квадрат константу это да, мощно
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #40046982
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какой код читать проще?

Код: pascal
1.
StatBuf.f_bavail * StatBuf.f_bsize / sqr(1024)



Код: pascal
1.
StatBuf.f_bavail * StatBuf.f_bsize / 1 048 576 



вдруг там логика какая-нибудь (не конкретно в этом примере, но все же)
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #40047038
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Проще читать:
Код: pascal
1.
2.
3.
4.
const
 OneMib = 1024 * 1024;

... / OneMiB;


или даже так:
Код: pascal
1.
... / (1024 * 1024);
...
Рейтинг: 0 / 0
RAD Studio 10.2 и Linux
    #40047461
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cptngrb
а какой код читать проще?

Код: pascal
1.
StatBuf.f_bavail * StatBuf.f_bsize / sqr(1024)



Код: pascal
1.
StatBuf.f_bavail * StatBuf.f_bsize / 1 048 576 



вдруг там логика какая-нибудь (не конкретно в этом примере, но все же)

Ну во-первых, как минимум
Код: pascal
1.
StatBuf.f_bavail * StatBuf.f_bsize / (1024*1024)

будет существенно быстрее и нагляднее, а во-вторых, магические константы - это в любом случае плохая практика, и вариант Алексея самый корректный
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RAD Studio 10.2 и Linux
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]