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

Использую Embarcadero® Delphi 10.2 Version 25.0.26309.314
...
Рейтинг: 0 / 0
05.02.2018, 21:40
    #39597092
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
Подсмотреть как сделано во Free Pascal?
...
Рейтинг: 0 / 0
05.02.2018, 21:47
    #39597096
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
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
05.02.2018, 22:54
    #39597110
azarenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
чччД, а без C никак не обойтись?
...
Рейтинг: 0 / 0
05.02.2018, 23:00
    #39597114
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
ну, если ты не можешь перевести structure в дельфийский рекорд - то никак, да.
...
Рейтинг: 0 / 0
05.02.2018, 23:27
    #39597126
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
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
06.02.2018, 02:02
    #39597157
azarenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
чччД, спасибо, завтра попробую!

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
06.02.2018, 02:51
    #39597162
Leonid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
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
06.02.2018, 13:08
    #39597403
azarenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
azarenko, пардон, так мы смотрим объем ОЗУ
...
Рейтинг: 0 / 0
06.02.2018, 13:08
    #39597404
azarenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
Leonid, спасибо, попробую!
...
Рейтинг: 0 / 0
06.02.2018, 18:31
    #39597673
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
azarenko,

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

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

Код: pascal
1.
WriteLn('DiskFree '+inttostr(DiskFree(AddDisk('/home/v1'))));
...
Рейтинг: 0 / 0
06.02.2018, 18:39
    #39597679
azarenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
makhaon, да, натыкался на это, но DiskFree и AddDisk нет в Embarcadero® Delphi 10.2 для Linux
...
Рейтинг: 0 / 0
09.07.2018, 15:15
    #39671661
azarenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
Всем спасибо!
Решение следующее:
Код: 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
Период между сообщениями больше года.
16.02.2021, 17:26
    #40045893
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
azarenko,

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

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

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



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



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

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

... / OneMiB;


или даже так:
Код: pascal
1.
... / (1024 * 1024);
...
Рейтинг: 0 / 0
20.02.2021, 11:01
    #40047461
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RAD Studio 10.2 и Linux
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RAD Studio 10.2 и Linux / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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