From e4a77d1a7201d95040f59748dafdab815accd947 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Sat, 22 Aug 2026 13:41:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BC=D0=B0=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=B8=D1=82=20?= =?UTF-8?q?=D1=81=D0=B2=D0=BE=D0=B9=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=B2=D0=BE=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D1=81=D1=81=D1=8B?= =?UTF-8?q?=D0=BB=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ссылка в ~/.local/bin и ярлык в меню запускают программу не по её настоящему пути. ExtractFilePath(ParamStr(0)) при этом указывал на каталог ссылки, и рядом с ней оказались бы и журнал, и файл зависимостей, и поиск ffmpeg «рядом с программой». Появился ProgramDir в uAppTypes: он раскрывает ссылки, пока они не кончатся, с ограничением на случай закольцованных. Под Windows ссылок такого рода нет, и путь берётся как есть. Заменены все четыре места, где каталог программы вычислялся вручную: журнал, поиск инструментов, каталог зависимостей и путь заготовки в проекте. Проверено: запуск через ~/.local/bin/nlve из домашнего каталога кладёт журнал в каталог программы, а не рядом со ссылкой. --- src/uAppTypes.pas | 40 +++++++++++++++++++++++++++++++++++++++- src/uDeps.pas | 4 ++-- src/uFfmpegCmd.pas | 2 +- src/uMainForm.pas | 2 +- src/uProject.pas | 2 +- 5 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/uAppTypes.pas b/src/uAppTypes.pas index d8b5eb5..86e6da1 100644 --- a/src/uAppTypes.pas +++ b/src/uAppTypes.pas @@ -11,7 +11,8 @@ unit uAppTypes; interface uses - SysUtils; + SysUtils + {$IFDEF UNIX}, BaseUnix{$ENDIF}; type { Чем заполнен сегмент готового ряда. @@ -119,6 +120,16 @@ function Plural(ACount: Integer; const AOne, AFew, AMany: string): string; Назад полоска не идёт никогда. } function AdvanceProgress(AShown, AReal, ANext, AStepShare: Double): Double; +{ Каталог, в котором лежит сама программа. + + Не ExtractFilePath(ParamStr(0)): если программу запустили через + символьную ссылку — а так она и попадает в PATH и в меню, — то путь + укажет на ссылку, и рядом с ней окажутся и журнал, и файл зависимостей, + и поиск ffmpeg. Ссылки раскрываются, пока не кончатся. + + Под Windows ссылок такого рода нет, и путь берётся как есть. } +function ProgramDir: string; + implementation var @@ -182,4 +193,31 @@ begin Result := 0.999; end; +function ProgramDir: string; +var + Path, Target: string; + {$IFDEF UNIX} + Guard: Integer; + {$ENDIF} +begin + Path := ExpandFileName(ParamStr(0)); + {$IFDEF UNIX} + { Ограничение на число переходов — от закольцованных ссылок. } + Guard := 0; + while Guard < 16 do + begin + Target := fpReadLink(Path); + if Target = '' then + Break; + { Ссылка может указывать и относительным путём — считаем его от + каталога самой ссылки. } + if (Length(Target) > 0) and (Target[1] <> '/') then + Target := ExpandFileName(ExtractFilePath(Path) + Target); + Path := Target; + Inc(Guard); + end; + {$ENDIF} + Result := ExtractFilePath(Path); +end; + end. diff --git a/src/uDeps.pas b/src/uDeps.pas index 55cb020..48ff2ed 100644 --- a/src/uDeps.pas +++ b/src/uDeps.pas @@ -24,7 +24,7 @@ unit uDeps; interface uses - Classes, SysUtils; + Classes, SysUtils, uAppTypes; type TStringArray = array of string; @@ -89,7 +89,7 @@ uses function DepTargetDir: string; begin - Result := ExtractFilePath(ExpandFileName(ParamStr(0))); + Result := ProgramDir; end; function DepsConfigPath: string; diff --git a/src/uFfmpegCmd.pas b/src/uFfmpegCmd.pas index 1760602..a8c441c 100644 --- a/src/uFfmpegCmd.pas +++ b/src/uFfmpegCmd.pas @@ -362,7 +362,7 @@ function LocateTool(const AName: string): string; var Own: string; begin - Own := ExtractFilePath(ExpandFileName(ParamStr(0))) + AName + Own := ProgramDir + AName {$IFDEF WINDOWS} + '.exe'{$ENDIF}; if FileExists(Own) then Exit(Own); diff --git a/src/uMainForm.pas b/src/uMainForm.pas index ee219dd..233fb8a 100644 --- a/src/uMainForm.pas +++ b/src/uMainForm.pas @@ -350,7 +350,7 @@ begin pnlVideo.Color := clBlack; memoLog.Clear; - FLogFilePath := ExtractFilePath(ExpandFileName(ParamStr(0))) + 'nlve.log'; + FLogFilePath := ProgramDir + 'nlve.log'; FPlayer := TMpvPlayer.Create(pnlVideo); FPlayer.OnLog := @PlayerLog; diff --git a/src/uProject.pas b/src/uProject.pas index bb8b969..8262766 100644 --- a/src/uProject.pas +++ b/src/uProject.pas @@ -912,7 +912,7 @@ begin if FFileName = '' then { Проект ещё не сохранён — держим кэш рядом с программой, чтобы не разбрасывать файлы по системным каталогам. } - Result := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + + Result := ProgramDir + 'unsaved.nlve-cache' + PathDelim else Result := IncludeTrailingPathDelimiter(ExtractFilePath(FFileName)) +