Копировать / извлечь часть пути к файлу? - PullRequest
5 голосов
/ 03 июня 2011

Как я могу скопировать / извлечь часть пути к файлу?

Например, скажите, если у меня есть этот путь: D: \ Programs \ Tools \ Bin \ Somefile.dat

как я могу скопировать / извлечь это, чтобы сделать это так:

C: \ Users \ Bin \ Somefile.dat

или

C: \ Users \ Tools \ Bin \ Somefile.dat

или

C: \ Users \ Программы \ Tools \ Bin \ Somefile.dat

Обратите внимание, что приведенные выше примеры принимают часть исходного пути и меняют его на другой каталог. Я думаю, что это называется Расширить имя или что-то, может быть, *

PS, я уже знаю о ExtractFileName, ExtractFilePath и т. Д., Путь в любом случае может быть динамическим, поскольку он не будет жестко закодированным, но постоянно меняется, поэтому эти функции, вероятно, бесполезны.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 03 июня 2011

Вот быстрая реализация, которая возвращает TAIL пути, включая указанное количество элементов. Также есть небольшая демонстрация того, как его использовать, и результаты - именно те, о которых вы просили. К сожалению, я не до конца понимаю, какие преобразования вы выполняете: это может быть именно то, что вы хотите, или это может быть что-то совершенно неправильное, что просто приводит к результату, похожему на ваш пример:

program Project25;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function ExtractPathTail(const OriginalPath:string; const PathElemCount:Integer):string;
var i, start, found_delimiters: Integer;
begin
  start := 0;
  found_delimiters := 0;
  for i:=Length(OriginalPath) downto 1 do
    if OriginalPath[i] = '\' then
    begin
      Inc(found_delimiters);
      if found_delimiters = PathElemCount then
      begin
        start := i;
        Break;
      end;
    end;
  if start = 0 then
    raise Exception.Create('Original path is too short, unable to cut enough elements from the tail.') // mangled English to help SO's code formatter
  else
    Result := System.Copy(OriginalPath, start+1, MaxInt);
end;

const SamplePath = 'D:\Programs\Tools\Bin\Somefile.dat';

begin
  try
    WriteLn('C:\Users\' + ExtractPathTail(SamplePath, 2)); // prints: C:\Users\Bin\Somefile.dat
    WriteLn('C:\Users\' + ExtractPathTail(SamplePath, 3)); // prints: C:\Users\Tools\Bin\Somefile.dat
    WriteLn('C:\Users\Programs\' + ExtractPathTail(SamplePath, 3)); // prints: C:\Users\Programs\Tools\Bin\Somefile.dat
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
0 голосов
/ 03 июня 2011

попробуйте использовать функции PathAppend и PathExtractElements

0 голосов
/ 03 июня 2011

Вы смотрели на функцию ExtractFileName? все построено для вас. Конечно, в зависимости от того, откуда приходят ваши пути / файлы, вам может понадобиться ExtractFilePath или другие связанные функции.

...