[pascal] wyświetlanie plików z danego katalogu

0

Witam!
Mam problem z programem takim jak w temacie - wyświetlanie plików z danego katalogu i segregowanie ich wg. nazwy, rozszerzenia, rozmiaru i daty powstania. Tzn znalazłem oczywiście procedury FindFirst i FindNext. I program teoretycznie działa (załącznik wszystkie.JPG). Procedura odpowiedzialna za samo wyświetlanie plików działa elegancko. Ale gdy chcę już sortować pliki np. według nazwy, to ostatni plik (ostatni, czyli zaczynający się na 'najpóźniejszą' literę) w katalogu wyświetlany jest podwójnie... Niezależnie od tego, czy sortuję według nazwy/rozmiaru (na razie tylko te procedury mam zrobione, ale podejrzewam, że dla pozostałych będzie to samo).
Deklaracje:

program plikens;
uses dos, crt;

 type
     pliki=^Element;
     Element=record
              nazwa:string;
              rozmiar: integer;
              czas: integer;
              pop, nastepny: pliki;
 end;

var
z: char;
pierwszy: pliki;     

Tak wygląda mój kod na sortowanie wg nazwy (wg rozmiaru jest prawie taki sam, z tym, że w niektórych miejscach jest rozmiar a nie nazwa i Size a nie Name):

procedure wgnazwy;

var
  DirInfo: SearchRec;
  nowyplik: pliki;
  wiekszy, mniejszy: pliki;

begin
clrscr;
 begin
  FindFirst('*.*', ReadOnly+Hidden+SysFile+Archive, DirInfo);

  new(nowyplik);
  nowyplik^.nazwa:= DirInfo.Name;
  nowyplik^.rozmiar:= DirInfo.Size;
  nowyplik^.czas:= DirInfo.Time;
    wiekszy:= pierwszy;
    nowyplik^.nastepny:= pierwszy;
    pierwszy:= nowyplik;


  while DosError = 0 do
  begin

    {Writeln(DirInfo.Name:20,' ',DirInfo.Size:10,' ',DirInfo.Time:20);    }
    FindNext(DirInfo);

  new(nowyplik);
  nowyplik^.nazwa:= DirInfo.Name;
  nowyplik^.rozmiar:= DirInfo.Size;
  nowyplik^.czas:= DirInfo.Time;
  wiekszy:= pierwszy;
  while (wiekszy <> nil) and (wiekszy^.nazwa < DirInfo.Name)
  do
  begin
    mniejszy:= wiekszy;
    wiekszy:= wiekszy^.nastepny;
  end;
  if wiekszy= pierwszy
  then begin
    nowyplik^.nastepny:= pierwszy;
    pierwszy:= nowyplik;
  end
  else if (wiekszy= nil)
  then begin
    mniejszy^.nastepny:= nowyplik;
    nowyplik^.nastepny:= nil;
  end else
   begin
    mniejszy^.nastepny:= nowyplik;
    nowyplik^.nastepny:= wiekszy;
  end;


 end;
 end;
 end;

 procedure wgnazwy_wypisz;
 var
  pom: pliki;
begin
wgnazwy;

  pom:=pierwszy;
  while pom <> nil
  do begin
    writeln(pom^.nazwa:20, ' ',pom^.rozmiar:10, ' ',pom^.czas:20);
    pom:=pom^.nastepny;
  end;

readln;
 end;                            

Wygląda to po wyświetleniu tak jak w załączniku wgnazwy.JPG i wgrozmiaru.JPG.
Pomógłby ktoś wskazać błąd w kodzie?

I drugi problem związany z wyświetlaniem.
Mam takie małe menu, jeżeli klikne np. 1 to sortuje wg nazwy, jeżeli 2, wg rozmiaru itp. Po sortowaniu wraca do menu. I jeżeli sortuje raz wg nazwy, wróce do menu, sortuje drugi raz wg nazwy np. (sortowania obojętnie jakie, zawsze podobnie jest) to on jakby zapisuje podwójnie wyniki wyszukiwania, powstaje coś takiego jak w załączniku problem.JPG. Z tym, że im więcej razy włącze sortowanie, tym więcej tych linijek powstanie. Próbowałem wstawiać gdzieś FindClose, ale nie pomogło niestety. Również proszę o jakieś wskazówki, jak zrobić, żeby tego nie było.

I takie jeszcze jedno pytanie. Czy tą 'datę' da się jakoś przekonwertować to normalnej daty? Sortowanie według tego już zrobiłem też i działa ok (poza wymienionymi wyżej problemami). Ale trochę dziwnie/nieładnie wygląda. Znalazłem procedury to zamiany tego na date ale w Delphi. Istnieje coś takiego w Pascalu?
Pozdrawiam ;)

0

Szkoda, że nikt nic nie odpisał. Ale z tymi problemami już sobie poradziłem.
Może ktoś chociaż to będzie wiedział - jak sortować pliki wg. rozszerzenia?

0

Poszukaj algorytmów sortowania - zwłaszcza quick sort.

0

Z samym sortowaniem sobię poradzę.
Bardziej chodzi mi o jakąś wskazówkę, jak np. z tego DirInfo.Name wydobyć samo rozszerzenie? Ja np. przypisywałem

nowyplik^.nazwa:=DirInfo.Name.

A czy da się jakoś przypisać samo rozszerzenie z DirInfo.Name do np. nowyplik^.roz?

0

W pętli malejącej sprawdzać czy znak z nazwy to kropka.
Jeżeli tak, to skopiować od tego znaku do MaxInt nazwę.
Później sortować te wydobyte rozszerzenia. Nie wiem na
ile to Tobie pomoże - tak najprościej mieć rozszerzenia i
dodam, co było dla mnie oczywiste, lecz może takie nie
jest dla wszystkich - pętlę zaczynamy od konca wyrazu,
o czym przypomniał mi w komentarzu Patryk27, dzięki.

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