HELP!! Jak pobrać drzewo katalogów szybko i bez FindNext

0

Potrzebuję szybko zaczytać całą strukturę katalogów na dyskach nie używając funkcji FindNext ponieważ robienie tego za pomocą tej funkcji i tak sprowadza się do przeszukania całego dysku i przecztania wszystkich plików (popaczcie sobie w źródła SysUtils to sie wyjaśni).
Bede wdzieczny za wszelkie informacje

Przeraszam wysztkich za kłopot ale spsób z findnext jest szybki i to wystarczająco. zamieszanie wprowadziło u mnie dodawanie do drzewa treeView trwało to bardzo długo
Dziękuje za rady! Pozdrawiam

0

Szukaj przy pomocy funkcji FindNext ale tylko katalogi bez plików

0

tak też robiłem i to jest dla mnie za wolno
interesuje mnie jakaś funkcja która nie bedzie trzepała po dysku i zwróci mi w jakiej kolwiek strukturze informację o katalogach w danym katalogu bądź na całym dysku

Funkcja findnext działa następująco:

function FindNext(var F: TSearchRec): Integer;
begin
  if FindNextFile(F.FindHandle, F.FindData) then //tutaj następuje znalezienie pierwszego lepszego pliku
    Result := FindMatchingFile(F) else //funkcja  FindMatchingFile sprawdza czy to co znaleziono spełnia warunki 
    Result := GetLastError;
end;

funkcja FindMatchingFile wygląda następująco:

function FindMatchingFile(var F: TSearchRec): Integer;
var
  LocalFileTime: TFileTime;
begin
  with F do
  begin
    while FindData.dwFileAttributes and ExcludeAttr <> 0 do //jeżeli plik nie pasuje do wzorca to pobieraj następny plik znajdujący się w katalogu w przeciwnym przypadku wypelnij strukture tSearchRec
      if not FindNextFile(FindHandle, FindData) then
      begin
        Result := GetLastError;
        Exit;
      end;
    FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
    FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi,
      LongRec(Time).Lo);
    Size := FindData.nFileSizeLow;
    Attr := FindData.dwFileAttributes;
    Name := FindData.cFileName;
  end;
  Result := 0;
end;

tak więc widać że i tak pomimo nałożonych ograniczeń funkcja przelatuje przez cały katalog i odczytuje wszytkie pliki w nim znajdujące się

0

procedure TF01.UpdateDir(const SourceDir : string );
var SR:TSearchRec;
begin
if FindFirst('nazwa dysku',faDirectory, SR) = 0 then
repeat
{ zapisywanie katalogów }
if ((SR.Attr and faDirectory)<>0)then
if (SR.Name<>'..') and (SR.Name<>'.') then
UpdateDir(SourceDir+'\'+SR.Name );

until FindNext(SR)<>0;
FindClose(SR);

end;

0
procedure TF01.UpdateDir(const SourceDir : string );
var SR:TSearchRec;
begin
 if FindFirst('nazwa dysku',faDirectory, SR) = 0 then
  repeat
   { zapisywanie katalogów }
   if ((SR.Attr and faDirectory)<>0)then
      if (SR.Name<>'..') and (SR.Name<>'.') then
       UpdateDir(SourceDir+'\\'+SR.Name );

  until FindNext(SR)<>0;
  FindClose(SR);
end;

To rozwiązanie to teraz stosuje chodzi mi o coś szybszego bo zastosowanie tego jest dla mnie zbyt wolne

0

Jeżeli to jest dla Ciebie jeszcze zwolne to przejdź na asm i czytaj dane bezpośrednio z sektorów będzie super szybko. Kiedyś prubowałem to zrobić pod WIN98, kiedy dowiedziałem się że w XP będzie inna struktura przechowywania danych to zrezygnowałem i Tobie też proponuję zrezygnować. Gdyż musiałbyś pisać odzielne procedury dla Fat16 i Fat32.

0

a nie wystarczy takie rozwiązanie jak w większości programów, że first run-pobiera listę folderów ?? i zapisuje w czytelnym dla programu pliku ?

0

ekhm... dobra konstrukcja taka podobna do tego (z tym że włącznie z plikami itp...) z wykorzystaniem do zapisania memorystreama na 20 GB dysku z na prawdą porąbaną strukturą plików i katalogów (łącznie było straśnie dużo wpisów) było tylko o ułamek sekundy wolniejsze niż windowsowskie okno właściwości folderu (a tam tylko liczy ilość plików!) może masz czoś skopane z zapisem?

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