Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Парсер путей файлов   Найти похожие ветки 

 
dimaxx ©   (2004-11-13 13:28) [0]

Есть список путей типа:

aaa\bbb\file.dat

Нужно распарсить весь список для выделения файлов и папок корневой директории и т.д. вглубь дерева. Также делает TotalCommander при входе в архив (ему как раз передается такой список).

Если кто видел ссылу на подобное или есть пример/сырец - киньте, плз.


 
Palladin ©   (2004-11-13 13:41) [1]

Pos, Copy + F1


 
Sam Stone ©   (2004-11-13 13:47) [2]

рекурсией обходи папки, собирай полные имена файлов, а после ищи в имени символ "\". Вот и все. Можно еще использовать ExtractFileName, ExtractFilePath (кажется, так пишутся).


 
begin...end ©   (2004-11-13 13:49) [3]

dimaxx ©   (13.11.04 13:28)

Разумеется, можно [1]. Но есть и ещё вариант.

Задача очень похожа на вот эту:

http://delphimaster.net/view/1-1100277025/ (посты [1] и [8])

с той лишь разницей, что в Вашем случае разделителем является символ "\".


 
dimaxx ©   (2004-11-14 22:23) [4]

Да нет, братцы, вы не поняли. Мне нужно из этой мешанины вытаскивать имена папок и файлов определенного уровня. Сначала все корневые, потом список файлов и папок какй-то выбранной пользователем папки. Так как вы действуетет в TotalCommander при "гулянии" по архиву.

2 Palladin: Без тебя знаю! :-)

2 Sam Stone: Про рекурсию в курсе, но как это сделать. Я прошу как раз совета или пример как это сделать. Распарсить на составляющие я могу, а как выбрать нужное?


 
Poirot ©   (2004-11-14 23:46) [5]

Тебе что надо сделать-то:) моя как то смутно полагает что мб FindNext FindFirst поможет:)
Как говорится сформулируй вопрос немного поточнее:)
Как это делай тотал командер в архивах - дык он просто выводит все папки и файлы по дпнному пути. От читает из архива, а тебе откуд надо читаь!?


 
Dimaxx ©   (2004-11-16 00:03) [6]

Оттуда же. Я писал, что есть список файлов (например, в TSrtingList) с относительными путями, которые получены из архива, т.е. нет таких файлов на диске. Поэтому FindNext/FindFirst не катит. Но мне нужно вывести их как в файловой панели TotalCommander"а и чтоб пользователь смог "гулять по архиву": входить в папки, помечать файлы для удаления/извлечения. То есть сформировать дерево папок в TListView. Для TTreeView у меня код есть, а мне нужен для ListView.


 
[lamer]Barmaglot ©   (2004-11-16 09:34) [7]

то Dimaxx ©   (16.11.04 00:03) [6]

Мбр...Включить в Листвиев сортировку? И сортировать так как тебе надо?


 
dimaxx ©   (2004-11-16 23:48) [8]

Мля, дядьки! Я вроде прально выражовывался в первом посте! Мне нужно, например, из списка файлов (которые получены из архива) типа:

aaa\bbb\file1.dat
aaa\bbb\file2.dat
aaa\bbb\file3.dat
aaa\bbb\file4.dat
ссс\ddd\file.bin
ссс\file.001
readme.txt


Нужно выдать в ListView сначала:

aaa
ccc
readme.txt


где aaa и ссс - папки, а readme.txt - файл. Потом пользователь может войти в папку ссс и увидеть следующее:

ddd
file.001


Причем тут сортировка? У меня список состоит из более чем 3000 файлов. Я спрашиваю алгоритм, по которому я смогу выдрать все файлы и папки корневого уровня, потом первого и т.д.


 
Defunct ©   (2004-11-16 23:56) [9]

Я с вами поделюсь рабочим модулем из одного из моих проектов. Модуль был написан под DOS на TP7, так что вы можете его улучшить.

Unit Folders;

Interface

Type
    TDirDOSName = String[12];

    PChainRec = ^TChainRec;
    TChainRec = Record
      Folder : String;     { TDirDOSName;}
      Exists : Boolean;
      N      : PChainRec;
    End;

    TFolderControl = Object
    Private
      Root      : PChainRec;
      Tail      : PChainRec;
      BackupDir : String;

      Procedure ClearFolderRec(Folder:PChainRec);
      Procedure Clear;
      Procedure DrawTree; {Debug only }
      Function  DirExists(P:PChainRec):Boolean;
      Function  ExpandFolderName(P:PChainRec):String;
    Public
      Correct : Boolean;
      Exists  : Boolean;
      Error   : Integer;

      Function    Name:String;
      Function    ExpandFilePath(FileName:String):String;
      Procedure   Load(Folder:String);
      Procedure   CreateFolder;
      Procedure   EnterIt;
      Procedure   LeaveIt;

      Constructor Init;
      Destructor  Done;
    End;

Procedure CheckFolder(Folder:String);
Function  FileExists(FileName:String):Boolean;
Function  ExtractFileName(FileName:String):String;

Var
   CritError : Integer;

Implementation

Const DOSNameSymbols = ["A".."Z",".","0".."9","a".."z","~"];

{****************************}
{****** Folder Control ******}
{****************************}

Constructor TFolderControl.Init;
Begin
 Root    := Nil;
 Tail    := Nil;
 Correct := False;
 Exists  := False;
 Error   := 0;
 BackupDir := "";
End;

Procedure TfolderControl.ClearFolderRec;
Begin
 If Assigned(Folder) Then
 Begin
   Folder^.Folder := "";
   Folder^.Exists := False;
   Folder^.N := Nil;
 End;
End;

Procedure TFolderControl.Clear;
Var P,P2:PChainRec;
Begin
 P := Root;
 While P<>Nil Do
 Begin
   P2 := P;
   P := P^.N;
   Dispose(P2);
 End;
 Root := Nil;
End;

Procedure TFolderControl.DrawTree;
Var P:PChainRec;
Begin
 P := Root;
 While P<>Nil Do
 Begin
   WriteLn(P^.Folder);
   P := P^.N;
 End;
End;

Function TFolderControl.Name;
Begin
 Name := ExpandFolderName(Tail);
End;

Function TFolderControl.ExpandFilePath;
Var Dir:String;
Begin
 Dir := Name;
 If Dir[Length(Dir)] <> "\" Then
    ExpandFilePath := Dir + "\" + FileName Else
    ExpandFilePath := Dir + FileName;

End;

Function TFolderControl.ExpandFolderName;
Var PL,Last:PChainRec;
   FName : String;
Begin
 PL := Root;
 FName := "";
 If PL<>Nil Then
 Repeat
   If PL=Root Then FName := FName + PL^.Folder Else
   Begin
     If FName[Length(FName)]<>"\" Then FName := FName + "\";
     FName := FName + PL^.Folder;
   End;
   Last := PL;
   PL := PL^.N;

 Until (PL = Nil) Or (Last = P);

 ExpandFolderName := FName;

End;

Function TFolderControl.DirExists;
Var Backup : String;
Begin
{$I-}
 GetDir(0, Backup);
 ChDir(ExpandFolderName(P));

 DirExists := IOResult=0;
 ChDir(Backup);
{$I+}
End;

Procedure TFolderControl.Load(Folder:String);
Var Current   : Integer;
   SubFolder : String;
   P,PL      : PChainRec;
Begin
 Current := 1;
 Error   := 0;
 PL      := Nil;
 SubFolder := "";
 Clear;
 While Current<=Length(Folder) Do
 Begin
   Case Folder[Current] Of
     ":"    :
     Begin { Disk }
       If (Root=Nil) And (Length(SubFolder)=1) Then
       Begin
         New(P);
         ClearFolderRec(P);
         P^.Folder := SubFolder + ":\";
         Root := P;
         PL   := P;
         P^.Exists := DirExists(P);
       End Else
       Begin
         Inc(Error);
       End;
       SubFolder := "";
     End;
     "\"    :
     Begin
       If (PL<>Nil) And
          (Length(SubFolder)>0) And (Length(SubFolder)<=12) Then
       Begin
         New(P);
         ClearFolderRec(P);
         P^.Folder := SubFolder;
         PL^.N := P;
         PL    := P;
         P^.Exists := DirExists(P);
       End Else
       If (Length(SubFolder)=0) And (PL=Root) Then
       Begin
         { Here is no error }
       End Else
       Begin
         Inc(Error);
       End;
       SubFolder := "";
     End;

     Else If Folder[Current] in DOSNameSymbols Then
     Begin
       SubFolder := SubFolder + Folder[Current];
     End
   End;
   Inc(Current);
 End;

 Tail := P;
 Exists := Tail^.Exists;
{  DrawTree;  {Debug}
End;

Procedure TFolderControl.CreateFolder;
Var P:PChainRec;
Begin
 P := Root;
 While P<>Nil Do
 Begin
   If (P=Root) And (Not DirExists(P)) Then
   Begin
     P := Nil;
     Inc(Error);
   End Else
   If (P<>Root) And (Not DirExists(P)) Then
   Begin
   {$I-}
     MkDir(ExpandFolderName(P));
     If IOResult<>0 Then Inc(Error);
   {$I+}
   End;

   P := P^.N;
 End;
End;

Procedure TFolderControl.EnterIt;
Begin
 CreateFolder;
{$I-}
 GetDir(0, BackupDir);
 ChDir(ExpandFolderName(Tail));
 If IOResult<>0 Then Inc(Error);
{$I+}
End;

Procedure TFolderControl.LeaveIt;
Begin
{$I-}
 ChDir(BackupDir);
 If IOResult<>0 Then Inc(Error);
{$I+}
End;

Destructor TFolderControl.Done;
Begin
 Clear;
End;
{****************************}

Function FileExists(FileName:String):Boolean;
Var F:File;
Begin
{$i-}
 Assign(F, FileName);
 Reset(F);
 Close(F);
{$i+}
 FileExists := IOResult=0;
End;

Function ExtractFileName(FileName:String):String;
Var S        : String;
   Pos,Dots : Integer;
   Done     : Boolean;
Begin
 S:= ""; Dots := 0;
 Pos := Length(FileName);
 Done := False;

 While (Length(S)<12) And (Pos<>0) And (Not Done) do
 Begin
   If FileName[Pos] in DOSNameSymbols Then
   Begin
     If FileName[Pos] = "." Then Inc(Dots);
     If Dots<2 Then S:= FileName[Pos] + S
               Else Done := True;
   End Else
   Begin
     Done := True;
   End;
   Dec(Pos);
 End;
 ExtractFileName := S;
End;

Procedure CheckFolder(Folder:String);
Var FC : TFolderControl;
Begin
 FC.Init;
 FC.Load(Folder);
 WriteLn("Selected folder => ",FC.Name,".....");
 If Not FC.Exists Then
 Begin
   FC.CreateFolder;
   WriteLn("not exists, making the folder ",FC.Name);
 End;

 If FC.Error>0 Then
 Begin
   WriteLn("Errors detected during a folder creation, error count: ",FC.Error);
   CritError := FC.Error;
 End;

 FC.Done;
End;

End.


 
Defunct ©   (2004-11-17 00:07) [10]

dimaxx, то что вам нужно, а именно дерево, отображается методом DrawTree [9].
Строится дерево в теле метода Load

Пример использования объекта TFolderControl можно посмотреть в процедуре CheckFolder.


 
dimaxx ©   (2004-11-17 22:49) [11]

Спасибо большое! Правда я сам уже написал, но работает громоздко. Но главное работает. Попробую еще этот вариант.



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
1-1100965289
Evgeny
2004-11-20 18:41
2004.12.05
Решение задач


4-1098694249
Wolffgang
2004-10-25 12:50
2004.12.05
Серийник винта.


8-1094027799
Ольга
2004-09-01 12:36
2004.12.05
Создание ICO из BMP с прозрачным фоном


4-1098283077
L.evil
2004-10-20 18:37
2004.12.05
TFileStream


4-1098457264
parent
2004-10-22 19:01
2004.12.05
Найти процедуру по адресу без отладчика