Страница 1 из 1

Преобразование путей к файлам

СообщениеДобавлено: 23.02.2014 04:23:44
Sharfik
Допустим есть путь в памяти программы вида
F:\Dropbox\MyProgram\src\build\..\..\ДистрТест\temp\manifest.xml

Существует функция в модулях где то, чтобы преобразовать путь к укороченному виду без относительности?

Re: Преобразование путей к файлам

СообщениеДобавлено: 23.02.2014 04:55:39
Максим
Что такое "укороченный вид без относительности"? Копайте в сторону ExpandFileNameUTF8.

Re: Преобразование путей к файлам

СообщениеДобавлено: 23.02.2014 05:32:04
Sharfik
Максим писал(а):Что такое "укороченный вид без относительности"? Копайте в сторону ExpandFileNameUTF8.

Это значит, что сделать из большого кол-ва символов меленькое, что по смыслу является тем же самым, но так же отсутствуют указатель перехода директорий. :)

Кажется нашел ее, но только вопрос на миллион.. чем отличаются эти три модуля LazFileUtils, FileUtil, SysUtils. Кто новее, на кого опираться и кому верить из них. Модули имеют одни и те же функции, порой с одинаковыми именами.

В LazFileUtils есть функция, которая вроде делает работу нужную, но алгоритм немного иной чем я себе накидывал.
Код: Выделить всё
На входе F:\Dropbox\MyProgram\src\build\..\..\ДистрТест\temp\manifest.xml
Path:=MinimizeSearchPath(Path);
На выходе SelectedPath F:\Dropbox\MyProgram\ДистрТест\temp\manifest.xml


Не хочу нагромождений, хоть и сделал небольшую свою функцию для того же.
Код: Выделить всё
function ConvertPathToShortPath(APath:String):String;
var
  iLen,iPos,i,b:Integer;
  DChar,XDir:String;
begin
  //  in: somebody\test\..\lala
  // out: somebody\lala
  DChar:=DirectorySeparator; //see Unit System
  XDir:=DChar+'..'+DChar;
  b:=0;
  iPos:=pos(XDir,APath);
  while iPos>0 do
  begin
      for i:=iPos-1 downto 1 do
      begin
          if APath[i]=DChar then
          begin
              break;
          end
          else begin
              inc(b);
          end;
      end;
      iPos:=0;
      if i>1 then
      begin
          b:=b+length(XDir);
          Delete(APath,i+1,b);
          iPos:=pos(XDir,APath);
      end;
      b:=0;
  end;
  Result:=APath;
end; 

Re: Преобразование путей к файлам

СообщениеДобавлено: 23.02.2014 16:06:00
Максим
Используйте функции из LazFileUtils. Функции из FileUtil ссылаются на LazFileUtils. SysUtils - это модуль RTL FPC, для версии 2.6.2 функции из него работают в кодировке ANSI.