CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Listowanie zawartości katalogu

Listowanie zawartości katalogu

dział ogólny

Listowanie zawartości katalogu

Nowy postprzez Pitek » piątek, 29 kwietnia 2011, 23:28

Witam!
Chciałbym napisać program który listowałby zawartość zadanego katalogu.
Przykład :
Mam taka strukturę katalogów jak na obrazku i chciałbym aby program po zadaniu mu katalogu początkowego w tym przypadku A listował po kolei zawartość czyli pliki a po napotkaniu katalogu przechodził do niego i ponownie listował pliki i tak aż do wyczerpania elementów zagnieżdżonych w ramach katalogu początkowego A. Wynik listowania miałby być zapisany we w miarę czytelny sposób do pliku listing.txt.
Gdyby np. w katalogu A były dwa pliki .txt a katalogu C jeden .jpeg:

C:\A\
C:\A\a.txt
C:\A\b.txt
C:\A\B\
C:\A\B\C\
C:\A\B\C\c.jpeg
C:\A\B\C\D\
C:\A\B\C\E\
C:\A\B\C\F\
C:\A\B\C\F\G\
.....itd.

Nie bardzo wiem jak się za to złapać, za samo to listowanie. Bardzo proszę o jakieś wskazówki jak to napisać.

Pozdrawiam pitek
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Listowanie zawartości katalogu

Nowy postprzez Cyfrowy Baron » sobota, 30 kwietnia 2011, 08:36

Ten problem był ostatnio wielokrotnie omawiany w tym dziale forum, aż nie chce się do tego ponownie wracać, gdyż wystarczy przejrzeć kilka ostatnich wątków.
Chodzi oczywiście o wyszukiwanie katalogów, podkatalogów i plików.

► patrz serwis: Cyfrowy Baron dział: porady -> różne -> Wyszukiwanie folderów, podfolderów i plików.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Listowanie zawartości katalogu

Nowy postprzez Pitek » poniedziałek, 2 maja 2011, 14:40

Dziękuję za odpowiedź szukając takiej porady przed napisaniem posta musiało mi to umknąć. Mam jeszcze jeden problem z tym związany, mianowicie jak wyszukać plik znając tylko jego nazwę i rozszerzenie a potem odczytać jego ścieżkę ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Listowanie zawartości katalogu

Nowy postprzez Cyfrowy Baron » poniedziałek, 2 maja 2011, 16:57

Dokładnie tak samo, czyli musisz przeszukiwać katalogi w poszukiwaniu konkretnego pliku. W linku do porady, który podałem w swoim poprzednim poście jest opisane jak wyszukiwać pliki po nazwie i rozszerzeniu. Najwyraźniej nie przejrzałeś tej porady. Chyba nie oczekujesz jakiegoś cudownego sposobu na poszukiwanie pliku?! :)

Przerobiłem ten kod tak by wyszukiwał pliki i był w na tyle funkcjonalny na ile chciało mi się to zrobić:

KOD cpp:     UKRYJ  
namespace SearchSection {
  BOOL bOnlyRoz;
  String sRoz, sName;

void FindFile(TStrings *SLista, String sDir, String sFileName, BOOL bSubFolder)
{
 TSearchRec sr;

  if(FindFirst(sDir + "*.*", faAnyFile, sr) == 0)
  {
   do
   {
        if( ((sr.Attr & faDirectory) > 0) && (sr.Name != ".") &&
                 (sr.Name != "..") && bSubFolder )
        {
         FindFile(SLista, sDir + sr.Name + "\\", sFileName, bSubFolder);
        }

        if(sFileName == "*.*")
        {
         if((sr.Attr & faDirectory) == 0 && (sr.Name != ".") && (sr.Name != ".."))
           SLista->Add(sDir + sr.Name);
        }
        else
        {
         if((sr.Attr & faDirectory) == 0 && SameText(sr.Name, sFileName) && !bOnlyRoz)
         {
          SLista->Add(sDir + sr.Name);
         }

         if(bOnlyRoz)
         {
          if((sr.Attr & faDirectory) == 0)
          {
           if(!sRoz.IsEmpty() && SameText(sRoz, ExtractFileExt(sr.Name) ))
                        SLista->Add(sDir + sr.Name);

           if(!sName.IsEmpty())
           {
                int p = sr.Name.LastDelimiter(".");
                if( SameText(sName, sr.Name.SubString(1, p - 1))  )
                   SLista->Add(sDir + sr.Name);
           }
          }
         }
    }
   }
   while(FindNext(sr) == 0);
   FindClose(sr);
  }
} }

TStrings *SearchFile(String sDir, String sFileName, BOOL bSubFolder)
{
 ::SetCursor(LoadCursor(NULL, IDC_WAIT));
 using namespace SearchSection;
 std::auto_ptr<TStringList> STempList(new TStringList());

 if(sFileName.IsEmpty()) return STempList.get();

 if(sDir.SubString(sDir.Length(), 1) != "\\") sDir = sDir + "\\";

 sRoz = "", sName = "";
 bOnlyRoz = false;

 if(sFileName.SubString(1, 1) == "*")
 {
  bOnlyRoz = true;
  sRoz = ExtractFileExt(sFileName);
 }
 if(sFileName.SubString(sFileName.Length(), 1) == "*")
 {
  bOnlyRoz = true;
  int p = sFileName.LastDelimiter(".");
  sName = sFileName.SubString(1, p - 1);
 }

 FindFile(STempList.get(), sDir, sFileName, bSubFolder);

 Screen->Cursor = crDefault;
 return STempList.release();
}


Kod można umieścić w dowolnym pliku. Najlepiej stworzyć sobie oddzielny moduł i tam go dać. O tworzeniu modułów, czyli plików z pogrupowanymi funkcjami, do wielokrotnego wykorzystania w wielu programach pisałem w serwisie Cyfrowy Baron, w dziale: teoria -> tworzenie modułów.

Co się zaś tyczy wywołania przedstawionej wyżej funkcji do wyszukiwania plików to można to zrobić tak:

wyszukiwanie wszystkich plików w zadanym katalogu (tutaj: c:\windows) oraz w podkatalogach:
KOD cpp:     UKRYJ  
 ListBox1->Items->AddStrings( SearchFile("c:\\windows\\", "*.*", true) );
// lub:
 ListBox1->Items = SearchFile("c:\\windows\\", "*.exe", true);


Przyjrzyjmy się argumentom funkcji SearchFile:

KOD cpp:     UKRYJ  
TStrings *SearchFile(String sDir, String sFileName, BOOL bSubFolder)


Jak widać funkcja zwraca wartość typu TStrings, więc zwrócona wartość pasuje do każdej listy tego typu, a więc zarówno do ListBox, ComboBox, czy Memo.

sDir - Pierwszy argument funkcji to wartość typu String (AnsiString lub UnicodeString), poprzez ten argument należy podać lokalizację katalogu, w którym chcemy szukać pliku lub plików.

sFileName - Drugi argument to wartość typu String (AnsiString lub UnicodeString) poprzez którą należy podać nazwę pliku. Można podać całą nazwę pliku, np: notepad.exe, wtedy program będzie szukał tylko pliku pasującego zarówno do nazwy jak i rozszerzenia. Można podać tylko nazwę pliku, ale zamiast rozszerzenia należy podać gwiazdkę, np: notepad.*. Program będzie szukał tylko plików z pasującą nazwą, ale z dowolnym rozszerzeniem. Można podać tylko rozszerzenie, ale zamiast nazwy należy podać gwiazdkę, np: *.exe. Program będzie szukał tylko plików z pasującym rozszerzeniem, ale z dowolną nazwą. Można podać tylko gwiazdki zamiast rozszerzenia i nazwy, np: *.*, program wyliczy wszystkie pliki w zadanym katalogu.

bSubFolder - Trzeci argument to zmienna typu BOOL, poprzez którą należy określić, czy funkcja ma przeszukiwać tylko zadany katalog - wartość false, czy ma przeszukiwać również podkatalogi w zadanym katalogu - wartość true.

Funkcja zwraca wartości do listy, gdyż zwracanie do zmiennej nie ma większego sensu, ponieważ w zadanej lokalizacji może być więcej niż jeden poszukiwany plik, jeżeli przeszukujemy również podkatalogi. Można oczywiście wykorzystać tą funkcje do poszukiwania jednego konkretnego pliku, ale w takiej sytuacji nie należy przeszukiwać podkatalogów. Trzeba również podać pełną nazwę poszukiwanego pliku. Jak wiadomo w katalogu może występować tylko jeden plik o tej samej nazwie i rozszerzeniu:

KOD cpp:     UKRYJ  
 Edit1->Text = SearchFile("c:\\windows\\", "notepad.exe", false)->Text.Trim();

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 18 gości

cron