Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Есть функция подсчета количества файлов в паке с подпапками для Windows
Function GetDocsCount(Dir: String; count: integer): integer;
Var
 SearchRec: TSearchRec;
begin
//добавляем все найденные файлы в таблицу
 try
   if Dir <> '' then Dir := IncludeTrailingPathDelimiter(Dir);
   if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
     repeat
       if (SearchRec.name='.') or
          (SearchRec.name='..') or
          (AnsiUpperCase(SearchRec.name) = AnsiUpperCase(sThumbnailFileName)) or
          (SearchRec.Name = '') then continue;
       if ((SearchRec.Attr and faDirectory) <> 0) then
         count := GetDocsCount(Dir + SearchRec.name, count) //we found Directory: "Dir+SearchRec.name"
       else
         begin
           Inc(count);
           
         end;

     until FindNext(SearchRec) <> 0;

 finally
   FindClose(SearchRec);
 end;
 result := count;
end;


А как эта функция будет "выглядеть" для Линукса?
Как ее переписать для Линукса?
17 июл 20, 09:44    [22169031]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
В линуксах не работает System.IOUtils?
17 июл 20, 09:47    [22169034]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Я не знаю, я ещё ни разу не писал под линукс, примеров не нашёл.
17 июл 20, 09:53    [22169041]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Начинаю припоминать....
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms

с Андроидом немного работал
17 июл 20, 09:58    [22169047]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 805
X11
Я не знаю, я ещё ни разу не писал под линукс, примеров не нашёл.


а ты ищи примеры работы с классами из System.IOUtils - они мультиплатфоменные все.
17 июл 20, 10:03    [22169050]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Нашел такое
http://docwiki.embarcadero.com/Libraries/Rio/en/System.IOUtils.TSearchOption
http://docwiki.embarcadero.com/CodeExamples/Rio/en/DirectoriesAndFilesEnumeraion_(Delphi)
http://docwiki.embarcadero.com/Libraries/Rio/en/System.IOUtils.TDirectory.GetFiles


Я так подразумеваю, что код будет такой:
Function GetDocsCount(Dir: String): integer;
begin
  result := Length(TDirectory.GetFiles(dir, '.', TSearchOption.soAllDirectories));
end;
17 июл 20, 10:13    [22169059]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 348
А откуда ты взял, что в Линуксе это не будет работать?
function FindFirst(const Path: string; Attr: Integer;
  var F: TSearchRec): Integer;
const
  faSpecial = faHidden or faSysFile or faDirectory;
{$IFDEF MSWINDOWS}
...
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
...
{$ENDIF POSIX}
17 июл 20, 10:23    [22169075]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
1. Ни откуда не взял, просто предположил.
2. Модуль System.IOUtils более новый, т.е. продвинутый, современный. Думаю, что его более правильно использовать.
17 июл 20, 10:25    [22169078]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Вопрос по маске
GetFiles(dir, '*.JPEG *.BMP *.PNG *.GIF', TSearchOption.soAllDirectories)


Как правильно ввести маску для поиска нескольких разных типов?
В документации описано только то, что якобы можно использовать только *.exe - т.е. один тип.
Как правильно? Через запятую, через пробел? Или вообще нельзя мульти маску использовать?
17 июл 20, 10:28    [22169080]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
X11
Через запятую, через пробел?


Методом научного тыка определил, что можно через точку с запятой. Но это для винды, а для Линукса?
17 июл 20, 10:30    [22169083]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
X11
X11
Через запятую, через пробел?


Методом научного тыка определил, что можно через точку с запятой. Но это для винды, а для Линукса?

GetFiles написан на дельфи. На кой его писать отдельно для каждой платформы?

Но исходники дадут более точный ответ.
17 июл 20, 10:33    [22169085]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 348
X11
1. Ни откуда не взял, просто предположил.
2. Модуль System.IOUtils более новый, т.е. продвинутый, современный. Думаю, что его более правильно использовать.

Эти вещи просто более модная обертка над все теми же функциями из SysUtils
17 июл 20, 11:09    [22169109]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Fr0sT-Brutal
Эти вещи просто более модная обертка над все теми же функциями из SysUtils


судя по исходникам, - нет
17 июл 20, 11:35    [22169125]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
http://docwiki.embarcadero.com/Libraries/Rio/en/System.IOUtils.TDirectory.TFilterPredicate

ну на крайний случай можно свою функцию (анонимную) написать, которая будет определять, включать ли файл в массив
17 июл 20, 11:35    [22169126]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
wadman
Но исходники дадут более точный ответ.


посмотрел, добрался до TMask.MatchesMaskStates(), так и не понял, какой разделитель используется, если вообще его там можно использовать
17 июл 20, 11:38    [22169128]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
тут огромная статья с примерами
http://www.proghouse.ru/programming/126-ioutils
17 июл 20, 12:10    [22169152]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
X11
X11
Через запятую, через пробел?


Методом научного тыка определил, что можно через точку с запятой. Но это для винды, а для Линукса?


В общем, так
GetFiles(dir, '*.JPEG *.BMP *.PNG *.GIF', TSearchOption.soAllDirectories)

не работает
17 июл 20, 12:20    [22169163]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50847

X11
А как эта функция будет "выглядеть" для Линукса?
Как ее переписать для Линукса?

Не надо никак переписывать. SysUtils под линухом полностью функционален "как есть".

Posted via ActualForum NNTP Server 1.5

17 июл 20, 12:32    [22169177]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
В общем, вот так получилось:

uses System.IOUtils, System.Types;
....

const cFileMaskImages = '*.JPG;*.JPEG;*.BMP;*.PNG;*.GIF';


....
implementation

uses
  System.SysUtils, System.Masks, System.StrUtils;

function GetListDocs(Dir: String): TStringDynArray;
var
 Predicate: TDirectory.TFilterPredicate;
 MaskArray: TStringDynArray;
begin
  MaskArray := SplitString(cFileMaskImages, ';');

  Predicate :=
    function(const Path: string; const SearchRec: TSearchRec): Boolean
    var
      Mask: string;
    begin
      for Mask in MaskArray do
        if MatchesMask(SearchRec.Name, Mask) then
          exit(True);
      exit(False);
    end;


  result := TDirectory.GetFiles(dir, '*', TSearchOption.soAllDirectories, Predicate);
end;
17 июл 20, 12:35    [22169179]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 348
X11
Fr0sT-Brutal
Эти вещи просто более модная обертка над все теми же функциями из SysUtils


судя по исходникам, - нет

Не знаю, как судишь исходники ты, но я вижу вот это
class procedure TDirectory.WalkThroughDirectory(const Path, Pattern: string;
  const PreCallback, PostCallback: TDirectoryWalkProc;
  const Recursive: Boolean);
var
  SearchRec: TSearchRec;
  Match: Boolean;
  Stop: Boolean;
begin
  if FindFirst(TPath.DoCombine(Path, '*', False), faAnyFile, SearchRec) = 0 then // DO NOT LOCALIZE
  ...
20 июл 20, 10:21    [22170242]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Интересно, почему разработчики в TFile не добавили метод GetFileSize()?
22 июл 20, 11:49    [22171593]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
X11
Интересно, почему разработчики в TFile не добавили FileSize()?
22 июл 20, 11:49    [22171594]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
"Дорого"... Оставили на следующие релизы.

Может это поможет? http://docwiki.embarcadero.com/Libraries/Rio/en/System.IOUtils.TDirectory.TFilterPredicate
22 июл 20, 11:55    [22171598]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Сделал так, надеюсь и для Линукса в будущем прокатит
function GetFileSize(const FileName: String): Int64;
var
  f: file of Byte;
begin
  try
    AssignFile(f, FileName);
    Reset(f);
    result := FileSize(f);
  finally
    CloseFile(f);
  end;
end;


Сообщение было отредактировано: 22 июл 20, 11:59
22 июл 20, 12:00    [22171602]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
читаю комменты
http://www.malcolmgroves.com/blog/?p=447

ещё 10 лет назад просили добавить

К сообщению приложен файл. Размер - 39Kb


Сообщение было отредактировано: 22 июл 20, 12:06
22 июл 20, 12:07    [22171607]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
X11
Сделал так, надеюсь и для Линукса в будущем прокатит
function GetFileSize(const FileName: String): Int64;
var
  f: file of Byte;
begin
  try
    AssignFile(f, FileName);
    Reset(f);
    result := FileSize(f);
  finally
    CloseFile(f);
  end;
end;

Надежнее открыть поток "для чтения" у самого TFile. Там и размер будет.
22 июл 20, 12:40    [22171630]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Если поток, то вопрос другой.
Картинки уже загружены в "карусель" для прокрутки. Т.е. они уже есть в памяти. Но ни TPicture, ни TGraphic не имеют свойства Size или чего-то такого.
Я пытался скопировать TPicture в TMemoryStream и получить его размер и тут засада. Для jpg вроде размер совпадает с размером, который показывает Проводник Винды, а вот для PNG размер TMemoryStream из TPicture примерно раз в 10 меньше. Т.е. для PNG размер файла 374кб, а размер TMemoryStream из TPicture - 32кб.

Сообщение было отредактировано: 22 июл 20, 12:52
22 июл 20, 12:53    [22171641]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
X11,

зачем узнавать размер файла для уже загруженной картинки? Почему во время загрузки этот момент не уточнить?
22 июл 20, 13:06    [22171650]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
1. Я ручками НИЧЕГО не загружаю, т.к. это делает стандартный метод LoadFtomFile().
2. Можно, конечно, самому ручками загружать через TFileStream. Но на момент загрузки размер не нужен. Характеристики картинки нужно показать только по нажатию на кнопку. При загрузке, получается, нужно создавать какой-то отдельный массив рекордов для хранения размеров и идентификаторов картинок? Но пользователь может удалять/добавлять картинки в карусель, тогда придется и этот массив редактировать. Уж слишком сложно получается и в памяти придется постоянно держать, возможно и никому не нужный массив рекордов. Почему "возможно и никому не нужный"? Потому что пользователь по своему желанию смотрит характеристики картинки.
22 июл 20, 13:22    [22171661]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
Под потоком я имел в виду у TFile
class function OpenRead(const Path: string): TFileStream; static;

А у потока есть свойство Size
http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TFileStream_Properties

Такой подход выглядит более пригодным для разных платформ.
22 июл 20, 13:39    [22171670]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
спасибо:

 result := TFile.OpenRead(FileName).Size
22 июл 20, 13:44    [22171671]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
X11
спасибо:

 result := TFile.OpenRead(FileName).Size

А Free?
22 июл 20, 13:52    [22171684]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
function GetFileSize(const FileName: String): Int64;
var
 FileStream: TFileStream;
begin
  if TFile.Exists(FileName) then
  try
    FileStream := TFile.OpenRead(FileName);
    result := FileStream.Size
  finally
    FileStream.Free;
  end
  else
    result := -1;

end;
22 июл 20, 14:03    [22171692]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
wadman
А Free?


странно, вот у меня в приложении включено
ReportMemoryLeaksOnShutdown := True;


но по завершении приложения тишина
22 июл 20, 14:04    [22171693]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 348
FileSeek еще можно применить. Либо реализовать самому, выдрав текст функции _FileSize из System (которая почему-то сделана приватной)
22 июл 20, 14:24    [22171718]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
misha mike
Member

Откуда:
Сообщений: 718
X11
Сделал так, надеюсь и для Линукса в будущем прокатит

А если файл монопольно занят другим процессом, то его размер нам уже не нужен?
Размер файла есть в оглавлении и извлекается теми же FindFirst/FindNext без открытия даже для наглухо заблокированных файлов.
22 июл 20, 17:56    [22171896]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
Это, конечно, круто и правильно, но это слишком сложно для меня

скажите, это оно?
https://delphidabbler.github.io/delphi-tips/tips/201.html
23 июл 20, 08:15    [22172086]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
misha mike
Member

Откуда:
Сообщений: 718
X11
Я ручками НИЧЕГО не загружаю, т.к. это делает стандартный метод LoadFtomFile().

Предлагаю вместо LoadFromFile делать сначала TFileStream.Create, а потом LoadFromStream. А между этими действиями прочитать TFileStream.Size. Так и руками ничего считывать не нужно, и размер файла получите из первых рук.
23 июл 20, 13:26    [22172311]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6353
X11
Это, конечно, круто и правильно, но это слишком сложно для меня

скажите, это оно?
https://delphidabbler.github.io/delphi-tips/tips/201.html


function ImageType(Fname: String): Smallint;
  if ImgExt = '.BMP' then
    Itype := 1
  else
  if (ImgExt = '.JPEG') or (ImgExt='.JPG') then
    Itype := 2


Ну во всяком случае функция определения типа изображения по расширению файла - от лукавого. Где еще .jfif, .jpe расширения (в ее контексте)? Лучше читать сигнатуры.
23 июл 20, 16:05    [22172496]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14308
по идее, хватит только jpg, т.к. почти все фотокамеры на смарфтонах делают фото в формате jpg
23 июл 20, 16:07    [22172499]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 348
Как интересно от размера файла перетекли к размерам изображения при заявленных в топике Find*
24 июл 20, 15:15    [22173227]     Ответить | Цитировать Сообщить модератору
 Re: Аналог TSearchRec, FindFirst, FindNext под Линукс  [new]
misha mike
Member

Откуда:
Сообщений: 718
Fr0sT-Brutal, то-ли еще бывает!
26 июл 20, 06:17    [22173718]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить