Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
Всем привет!
Столкнулся со следующей проблемой:
в Windows, чтобы посмотреть объем диска и свободное пространство, используется DiskSize и DiskFree, а как посмотреть объем диска в Linux? Облазил весь интернет - ничего не нашел. Может у кого-то есть дока по взаимодействию приложений с linux?

Использую Embarcadero® Delphi 10.2 Version 25.0.26309.314
5 фев 18, 21:32    [21168168]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 983
Подсмотреть как сделано во Free Pascal?
5 фев 18, 21:40    [21168187]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
чччД
Guest
azarenko,

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

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

Буфер:
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
5 фев 18, 21:47    [21168200]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
чччД, а без C никак не обойтись?
5 фев 18, 22:54    [21168417]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
Vizit0r
Member

Откуда:
Сообщений: 563
ну, если ты не можешь перевести structure в дельфийский рекорд - то никак, да.
5 фев 18, 23:00    [21168436]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
чччД
Guest
azarenko,

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

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

+ Реальный пример
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.
5 фев 18, 23:27    [21168494]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
чччД, спасибо, завтра попробую!

p.s.: нашел интересную реализацию, но она для mac os (используется Posix.SysSysctl):
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;
6 фев 18, 02:02    [21168734]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
Leonid
Member

Откуда: From nowhere
Сообщений: 684
azarenko
как посмотреть объем диска в Linux?
Использую Embarcadero® Delphi 10.2 Version 25.0.26309.314

Не претендую на идеально-правильное решение, но у себя в библиотеке для разных платформ реализовал так:

{$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}
6 фев 18, 02:51    [21168760]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
azarenko, пардон, так мы смотрим объем ОЗУ
6 фев 18, 13:08    [21169679]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
Leonid, спасибо, попробую!
6 фев 18, 13:08    [21169683]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2889
azarenko,

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

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

WriteLn('DiskFree '+inttostr(DiskFree(AddDisk('/home/v1'))));
6 фев 18, 18:31    [21170895]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
makhaon, да, натыкался на это, но DiskFree и AddDisk нет в Embarcadero® Delphi 10.2 для Linux
6 фев 18, 18:39    [21170913]     Ответить | Цитировать Сообщить модератору
 Re: RAD Studio 10.2 и Linux  [new]
azarenko
Member

Откуда: Москва
Сообщений: 27
Всем спасибо!
Решение следующее:
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. Прошу прощения за долгий ответ :)
9 июл 18, 15:15    [21556592]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить