Recent

Author Topic: А есть ли готовые решения по "кроссплатформенной" проверке путей?  (Read 1138 times)

shraibikus

  • Newbie
  • Posts: 4
Здрасте.

Столкнулся в общем. Беда такого рода. Есть некое приложение, которое кроссплатформенное (Windows, Linux, iOS). Не моё.
И оно (поскольку кроссплатформенное) имеет в себе еще возможность "пользовательского" участия (они ему делают так скажем "аддоны").
Эти самые "аддоны" складываются аккуратно в папку. И имеют определенную структуру.

Однако, известно, что пользователи Windows не задумываются об разнице между "Addons", "addons" а иногда и даже "AddOns"...
И это только один пример, на практике в папке есть несколько подобных файлов и папок.

Внимание вопрос: есть ли готовое решение, которое позволяет DirectoryExists проверить наличие по "addons" имея в виду соответственно и "Addons" и даже "AddOns" вместе взятые за один заход. Или нужно пилить свой обработчик проверки ФС (работать предполагается в том числе и на Linux'ах с их ФС)?

Спасибо.

mig-31

  • Full Member
  • ***
  • Posts: 244
Что пилить, если все и так ясно.
DirectoryExists  и FileExists кроссплатфоменно.

В Windows будет только одна папка. В Unix/Linux возможны варианты, все зависит от файловой системы (Linux и с NTFS умеет работать).

Просто получите список директорий папки в которой находятся "Addons", "addons"  и т.д. На NTFS у вас будет всегда только одна папка.
Можете с помощью $IFDEF сделать поиск списка только для UNIX, если у вас пользователи на Linux неработают с NTFS/FAT32
Code: Pascal  [Select]
  1. {$IFDEF UNIX}
  2. {$END_IF}
  3.  
Lazarus 2.0.0 - CentOS 7.x, Mageia 6.1

shraibikus

  • Newbie
  • Posts: 4
Я боюсь что Вы меня не поняли.

Речь о том, что я заведомо не знаю как у них написано. И мне надо проверять наличие папкок и файлов, с оглядкой на привычки Windows-пользователей. Ибо они имеют свойство называть папки даже "AdDoNs" (итд). ФС соответственно в каждом случае может быть разная (я это прекрасно понимаю). Но, ведь если я проверяю под Windows машиной наличие папки так
Code: [Select]
If DirectoryExists(...'Addons') then ...
я получаю истину, если там папка называется на самом деле "AddOns".

Я компилирую это же приложение на Linux (со всеми вытекающими, включая то какая там будет ФС). И там установлена эта же версия аддона (плагина) тем же самым разработчиком, который назвал папку именно "AddOns". А я то по прежнему проверяю по
Code: [Select]
If DirectoryExists(...'Addons') then ...
... но ведь там я получу ложь, так как папка то на самом деле называется "AddOns".

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

lucamar

  • Hero Member
  • *****
  • Posts: 1945
В Linux имена файлов и папок почти всегда чувствительны к регистру, поэтому, если папка называется "AddOns", DirectoryExists(«Addons») вернет False. Только DirectoryExits('AddOns') вернет True.

* Переведено гуглом, извините если это плохо русский
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

shraibikus

  • Newbie
  • Posts: 4
Спасибо. Я понял.
Нужно колдовать)

ASerge

  • Hero Member
  • *****
  • Posts: 1355
Code: Pascal  [Select]
  1. function DirExists(const Where, What: string): Boolean;
  2. var
  3.   R: TSearchRec;
  4. begin
  5.   if FindFirst(IncludeTrailingPathDelimiter(Where) + AllFilesMask, faDirectory, R) <> 0 then
  6.     Result := False
  7.   else
  8.     try
  9.       repeat
  10.         Result := ((R.Attr and faDirectory) <> 0) and SameFileName(R.Name, What)
  11.       until Result or (FindNext(R) <> 0);
  12.     finally
  13.       FindClose(R);
  14.     end;
  15. end;

shraibikus

  • Newbie
  • Posts: 4
Code: Pascal  [Select]
  1. function DirExists(const Where, What: string): Boolean;
  2. var
  3.   R: TSearchRec;
  4. begin
  5.   if FindFirst(IncludeTrailingPathDelimiter(Where) + AllFilesMask, faDirectory, R) <> 0 then
  6.     Result := False
  7.   else
  8.     try
  9.       repeat
  10.         Result := ((R.Attr and faDirectory) <> 0) and SameFileName(R.Name, What)
  11.       until Result or (FindNext(R) <> 0);
  12.     finally
  13.       FindClose(R);
  14.     end;
  15. end;
Спасибо :-)