Katalogowanie plików

0

Próbuję pisać program do katalogowania danych. Mam jednak problem.

Potrzebuję jakiegoś algorytmu (niekoniecznie kodu) do zapisu drzewa katalogów do pliku i późniejszego odczytu.

Obecnie robię to tak:

procedure Kataloguj(tnRodzic : TTreeNode; strSciezka : string);

var

iWynik : integer;

tnDziecko : TTreeNode;

Licznik : integer;

begin

 iWynik := FindFirst(strSciezka + '*.*', faAnyFile, sr);

 while iWynik = 0 do

 begin

   if (sr.Name <> '.') and (sr.Name <> '..') then

   begin

     tnDziecko := frm.trv.Items.AddChild(tnRodzic, sr.Name);

     Licznik := Licznik + 1;

     frm.Caption := 'Znalazlem : ' + IntToStr(Licznik) + 'plików.';



     if ((sr.Attr and faDirectory) = faDirectory) then

     begin

       tnRodzic.ImageIndex := 0;

       Kataloguj(tnDziecko, strSciezka + sr.Name + '');

     end

     else

     begin

       tnDziecko.ImageIndex := -1;

       tnDziecko.SelectedIndex := -1;

     end;

   end;

   iWynik := FindNext(sr);

 end;

 FindClose(sr);

end;



procedure Tfrm.btnClick(Sender: TObject);

var

 cDysk : Char;

begin

 frm.trv.Items.BeginUpdate;

 trv.Items.Clear;

 cDysk := 'F';

 Kataloguj(trv.Items.AddChild(nil, '(Dysk ' + cDysk + ':)'), cDysk + ':');

 frm.trv.Items.EndUpdate;

end;

Pliki i katalogi ładowane są do TreeView. Ten sposób nie odpowiada mi z kilku względów: drzewo jest nieposortowane (nie wiem, jak zrobić, aby katalogi były na górze), poza tym chciałbym zapisywać też rozmiar i inne info o pliku, tak by pliki wypisać później w ListView.

Bardzo proszę o podanie algorytmu, jakiegoś sposobu, pomysłu. Z kodem sobię jakoś poradzę.

0

Hmm.. mozesz to zapisac na kilka sposobow:

  1. Tablica rekordow z polami: sciezka, rozmiar, etc

  2. Plik ini:
    SEkcje o numerach od 0 do n, ktore wygladaja przykladowo tak:
    [0]
    sciezka="C:Windows"
    rozmiar=100
    [1]
    sciezka="C:WindowsSystem"
    rozmiar=123
    ...
    Kazda sekcja to osobny katalog, zajmuje to duzo miejsca w pliku ale latwo sie z niego zapisuje/ofczytuje
    Ja tak dosyc czesto robie... (:

  3. Mozesz zapisac w pliku, kazda linijka osobno w jakims "swoim" formacie, np:
    sciezka;;rozmiar;;atrybuty
    I kazda linijka to osobny katalog... a dane oddzielone sa ";;"

Nic wiecej nie przychodzi mi do glowy... (;

0

Moja propozycja jest taka, aby katalogi i pliki trzymać w postaci następujących wpisów:
ID | NAZWA | ID_NADRZĘDNEGO | ROZMIAR | INFO | ...

Katalogi od plików możesz rozróżniać powiedzmy po nazwie z backslashem: "Katalog" lub na przykład ujemnym rozmiarze, albo po prostu dodatkowej kolumnie. Katalog główny będzie miał ID_NADRZĘDNEGO równy NULL. Jak przechowujesz również litery dysków, to polecam jako katalogi główne ustawić na przykład:

0 | C:\ | NULL | -1 | Mój dysk główny     |
1 | D:\ | NULL | -1 | Mój dysk dokumentów |

Przykładowa struktura katalogu i pliku C:\Windows\Notepad.exe:

0 | C:\         | NULL |     -1 | Mój dysk główny     |
1 | Windows\    |    0 |     -1 | Folder systemowy    |
2 | Notepad.exe |    1 | 151040 | Aplikacja notatnika |

Wyciąganie do TreeView jest już banalnie proste - najpierw przechodząc przez wszystkie wpisy z ID_NADRZĘDNEGO równe NULL dodajesz je jako elementy główne, (1) a następnie póki w poprzedniej pętli dodano jakiś element główny, dla każdego elementu dodajesz dzieci, których ID_NADRZĘDNEGO wynosi tyle, ile ich ID i jeśli są one katalogami, będą stanowiły elementy główne i wykonujesz znów (1). Zatem jeśli w poprzedniej pętli nie dodałeś żadnego katalogu, kończysz. Zależnie od sposobu, w jaki będziesz dodawał elementy, drzewo otrzymasz posortowane lub nie.

@#5Szczawik: Daruj sobie INI, szkoda nerwów. Lepiej postawić to na bazie SQL (nawet choćby embedded) lub przynajmniej XML.

0

też jestem za bazą (np. sqlite, fb embedded). Pliki ini nie radzą sobie z wartościami wielolinijkowymi (tzn. nie radzą sobie z CRLF), wyszukanie czegoś w pliku xml, który ma więcej jak 10MB trwa dłuższą chwilę, przy plikach typowanych jak coś Ci się zwali/będziesz chciał "ręcznie" go poprawić albo podajrzeć to może być ciężko, dodatkowo wyszukiwanie czegoś w plikach typowanych to masochizm, a pisanie od podstaw prostej BD (pliki + indexy) to nieporozumienie.

0

Que?? Mi się coś widzi że pierwsze 2 posty pisał ten sam kolo...

// ip, przeglądarka, system - wszystko takie samo. kolejny gościu z rozdwojeniem jaźni - Ł

1 użytkowników online, w tym zalogowanych: 0, gości: 1