Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Адрес файла. Взять подпапку.


Автор: Ner-zul 30.1.2007, 17:23
  
  Сложно Объяснить, задача такая. У меня есть переменная Path, в которой хранится текущая дирректоия. Я сканирую эту дирректорию на наличие папок и файлов и обрабатываю их определенным образом. Пусть Path='D:\Cd\543\Test\'. 
   Существует ли какой-нибудь нормальный способ, кроме синтаксического анализа, чтобы получить из переменной Path, Переменную DirectPath='D:\Test\' ....?

Автор: Snowy 30.1.2007, 17:45
А какая корелляция между этими двумя путями?
Я вижу только имя диска и имя последнего вложения.
Какая схема перевода из одного в другое?

Автор: W4FhLF 30.1.2007, 17:49
А что значит кроме синтаксического анализа?

Ну можно допустим с помощью регулярных выражений:

Код

function GetPath(sData: string): string;
var
  exp:TRegExpr;
begin
  exp := TRegExpr.Create;
  exp.Expression := '((\w|\d)+\\)+';
  if sData[Length(sData)] = '\' then sData[Length(sData)] := Chr(0);
  Result := exp.Replace(sData, '');
  exp.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(GetPath('D:\Cd\543\Test\'));
end;


Как результат:

Цитата

---------------------------
Project1
---------------------------
D:\Test
---------------------------
OK   
---------------------------




Автор: Ner-zul 30.1.2007, 17:56
В том то и дело что схемы никакой нет. Мне просто надо выкинуть из адреса папки (текущей), две корневые папки. притом две первые из них. То есть если текущая папка будет на 7 уровне вложенности , типа D:\aaa\bbb\ccc\ddd\eee\fff\Test  , то мне надо получить
                              D:\ccc\ddd\eee\fff\Test

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

Добавлено @ 18:03 
W4FhLF, какой интересный способ, вы не могли бы его пояснить его по строчкам.
Особенно не понятно:
exp.Expression := '((\w|\d)+\\)+';
  if sData[Length(sData)] = '\' then sData[Length(sData)] := Chr(0);

Автор: W4FhLF 30.1.2007, 18:12
Цитата(Ner-zul @  30.1.2007,  17:56 Найти цитируемый пост)
притом две первые из них.


Тогда вот так вот делай:

Код

function GetPath(sData: string): string;
var
  exp:TRegExpr; // Для этого должен быть установлен этот компонент, а в секцию uses
                // добавлено RegExpr (http://www.torry.net/vcl/vcltools/text/regexpr.zip)
begin
  exp := TRegExpr.Create;
  exp.Expression := '\w\:\\'; // Задаём маску в виде регулярного выражения, в данном случае
                              // она описывает любую строку вида D:\ (вместо D может быть любая буква)
  exp.Exec(sData);            // Осуществляет поиск соответствий маске
  Result := exp.Match[0];     // Первое соответствие записано в массике Match.
                              // В нашем случае это обозначение физического диска(D:\)
  exp.Expression := '\w\:\\([a-zA-Z0-9]+\\){2}'; // Вводим другую маску, которая описывает шаблок вида:
                    //[любая буква]:\[1 или больше символов из набора]\[1 или больше символов из набора]\
  Result := Result + exp.Replace(sData, ''); // Производим замену текста соответствующего маске на пустую строку.
                                             // В нашем случае это текст: D:\aaa\bbb\
  exp.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(GetPath('D:\aaa\bbb\ccc\ddd\eee\fff\Test'));
end;



Как результат:

Цитата

---------------------------
Project1
---------------------------
D:\ccc\ddd\eee\fff\Test
---------------------------
OK   
---------------------------


Добавлено @ 18:12 
Сейчас прокомментирую вкратцеsmile

Автор: Yanis 30.1.2007, 19:02
W4FhLF
А если в названиях папок региональные символы присутствуют, код нормально будет работать?

Автор: W4FhLF 30.1.2007, 19:09
Цитата(Yanis @  30.1.2007,  19:02 Найти цитируемый пост)
А если в названиях папок региональные символы присутствуют, код нормально будет работать?


Нет, надо расширить символьный класс, пока, что он описывает все цифры и большие/маленькие буквы английского алфавита. 

Автор: Ner-zul 31.1.2007, 11:15
Всем Спасибо.

Автор: Ner-zul 31.1.2007, 11:36
А вот такой еще вопрос, как можно выкинуть символ из строки, со сдвигом строки влево???
Или, к примеру, отрезать кусок строки??? с такого-то по такой-то номер....???

Автор: Yanis 31.1.2007, 11:44
Ner-zul
Delete(var, ...);
var := Copy(var, ....);

Автор: Ner-zul 31.1.2007, 11:45
Спасибо.

Автор: Yanis 31.1.2007, 11:45
from delphi help:
Код
 var
   s: string;
 begin
   s := 'Honest Abe Lincoln';
   Delete(s,8,4);
   Canvas.TextOut(10, 10, s);    { 'Honest Lincoln' }
 end;

Автор: Ner-zul 31.1.2007, 12:23
Да я понял сразуsmile Хелп почиталsmile
Уже все получилось, спасибоsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)