Zawartość katalogu

dział ogólny

Zawartość katalogu

Nowy postprzez wargo » piÄ…tek, 22 sierpnia 2008, 14:30

Jak odczytać jakie pliki znajduja się w wybranym folderze?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez Cyfrowy Baron » piÄ…tek, 22 sierpnia 2008, 14:35

► patrz serwis: Cyfrowy Baron dziaÅ‚: porady | różne1 | wyszukiwanie folderów, podfolderów i plików [2].
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
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez wargo » piÄ…tek, 22 sierpnia 2008, 14:37

[Usunąć]
Ostatnio edytowano piÄ…tek, 27 lutego 2009, 20:23 przez wargo, Å‚Ä…cznie edytowano 1 raz
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez wargo » piÄ…tek, 22 sierpnia 2008, 15:12

Aha, nie wiedziałem że to to, przecież można wyszukać *.* ;]

Ale niestety mam problem :(
Chcę umieścić wyniki w ListView więc zmodyfikowałem kod (wskazanie obiektu i funkcje dodawania) ale po wywołaniu:
Kod: Zaznacz cały
FindDir(Left, "d:\\w\\");

mimo że taki katalog istnieje pokazuje po kompilacji:
EAccesViolation
Ostatnio edytowano piÄ…tek, 27 lutego 2009, 20:24 przez wargo, Å‚Ä…cznie edytowano 1 raz
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez Cyfrowy Baron » piÄ…tek, 22 sierpnia 2008, 19:01

FindDir(Left, "d:\\w\\");


Left oznacza tutaj pozycję formularza względem lewej strony pulpitu. Co to wogóle oznacza.

Jeżeli nagłówek funkcji ma taką postać:

FindDir(TListBox *lista, String Dir)

To oznacza, że pobiera dwa argumenty, pierwszy to wskaźnik do obiektu typu TListBox, a drugi to wartość typu AnsiString. Funkcja wyszukiwania zawiera wywołanie rekurencyjne, więc odwołuje się sama do siebie, ale nie możesz jej w wywołaniu rekurencyjnym przekazywać dowolnych wartości, musisz zawsze przekazywać takie wartości jakich funkcja oczekuje, czyli w przykładzie pierwszy argument to zawsze wskaźnik do ListBox, a drugi to wartość typu AnsiString i nie możesz tam wstawiać nic innego.
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
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez wargo » piÄ…tek, 22 sierpnia 2008, 19:25

Ja zmieniłem nazwy oczekiwanych wartości a left to nazwa nadana obiektowi listview, równiez roght, jest podana sama więc chyba nie jest zarezerwowana i nie pojawił się w związku z tą opcją błąd.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez Cyfrowy Baron » sobota, 23 sierpnia 2008, 09:24

Nie możesz używać nazw zarezerwowanych, Left i Right są zarezerwowane dla komponentów, więc nie mogą być używane, ale możesz użyć nazwy np. LEFT, RIGHT.
Pisząc programu używaj nazw które coś mówią o obiekcie inaczej wracając do takiego projektu po jakimś czasie nie będizesz wiedział co jest czym. dlatego dla listy najlepiej jest używać nazwy poprzedzonej słowem List, np. listLEFT, listRIGHT.
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
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez wargo » sobota, 23 sierpnia 2008, 11:05

Ale nie pokazało mi błędy w zwiaku z nimi, chyba że "poprawnie" je wykorzystałem.
Edycja:
Usunąłem oczekiwany parametr list oraz w wywołaniu i dałem:
Kod: Zaznacz cały
if(((sr.Attr & faDirectory) > 0) & (sr.Name != ".") & (sr.Name != ".."))
//        ShowMessage(sr.Name);//It work!!!!!!!
            Form1->LewaLista->Items->Add();
          Form1->LewaLista->Items->Item[x]->Caption = sr.Name;
        }

I 2 rzeczy:
-Kiedy użyję showMessage program działa ale wyświetla tylko katalogi.
-Kiedy dodam dodawanie do listy ale nie sr.Name to dodaje 1 pozycjÄ™!
-Kiedy dodam sr.Name - EAccesViolation ;] <-
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez Cyfrowy Baron » sobota, 23 sierpnia 2008, 12:50

Nie rozumiem w czym masz problem skoro w serwisie podałem gotowy kod, ale widzę co najmniej jeden potencjalny błąd, otóż nie wiadomo czym jest zmienna x, jest to zapewne typ Integer (int), ale jak zwiększasz jej wartość, jeżeli w każdym obiegu funkcji, to nie będzie działać prawidłowo, gdyż jest to funkcja rekurencyjna i nie wykonuje się ona jak pętla, lecz jest wywoływana wielokrotnie, poza tym wywołuje samą siebie, a to oznacza, że jeżeli zadeklarowałeś x jako zwykłą zmienną int i na samym początku wywołania funkcji ustawiasz jej wartość np. na 0, to jako, że jest to funkcja rekurencyjna, czyli taka, która wywołuje samą siebie, to po każdorazowym "wywołaniu siebie" będzie ona ustawiała wartość zmiennej x na 0, dlatego należy zadeklarować tą zmienną jako zmienną globalną, której wartość ustawiasz na 0, przed wywołaniem funkcji.

Oto kilka wariacji odnośnie tej funkcji. We wszystkich przykładach zastosuję obiekt ListView, jak ty w swoim, ale nie będę się odwoływał do niego jak Ty poprzez adresowanie formularza. lecz przez bardziej użyteczny wskaźnik będący argumentem funkcji:



Wyszukiwanie plików w zadanym folderze z pomijaniem folderów, czyli wyświetlane są same nazwy znalezionych plików:

Kod: Zaznacz cały
int x;
void __fastcall FindDir(TListView *lista, String Dir)
{
  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
     {
      do{
         if(((sr.Attr & faDirectory) > 0) & (sr.Name != ".") & (sr.Name != ".."))
           {
         FindDir(lista, Dir + sr.Name + "\\");
         }
         if((sr.Attr & faDirectory) == 0)
         {
         lista->Items->Add();
         lista->Items->Item[x]->Caption = sr.Name;
         Application->ProcessMessages();
         x++;
         }
        }
        while(FindNext(sr) == 0);
        FindClose(sr);
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x = 0;
ListView1->Items->Clear();
FindDir(ListView1, "c:\\windows\\system32\\");   
}
//---------------------------------------------------------------------------




Wyszukiwanie plików w zadanym folderze z pomijaniem folderów, czyli wyświetlane są pełne ścieżki dostępu do plików, jednak nazwy samych katalogów nie są rzucane na listę:

Kod: Zaznacz cały
int x;
void __fastcall FindDir(TListView *lista, String Dir)
{
  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
     {
      do{
         if(((sr.Attr & faDirectory) > 0) & (sr.Name != ".") & (sr.Name != ".."))
           {
         FindDir(lista, Dir + sr.Name + "\\");
         }
         if((sr.Attr & faDirectory) == 0)
         {
         lista->Items->Add();
         lista->Items->Item[x]->Caption = Dir + sr.Name; // tutaj dodaÅ‚em odwoÅ‚anie do zmiennej Dir
         Application->ProcessMessages();
         x++;
         }
        }
        while(FindNext(sr) == 0);
        FindClose(sr);
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x = 0;
ListView1->Items->Clear();
FindDir(ListView1, "c:\\windows\\system32\\");   
}
//---------------------------------------------------------------------------




Wyszukiwanie plików w zadanym folderze z pomijaniem folderów, czyli wyświetlane są pełne ścieżki dostępu do plików, jednak nazwy samych katalogów nie są rzucane na listę. Dodatkowo zastosowałem podział, w pierwszej kolumnie wyświetlane są tylko ścieżki dostępu do plików, a w drugiej nazwy plików.:

Kod: Zaznacz cały
int x;
void __fastcall FindDir(TListView *lista, String Dir)
{

  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
     {
      do{
         if(((sr.Attr & faDirectory) > 0) & (sr.Name != ".") & (sr.Name != ".."))
           {
         FindDir(lista, Dir + sr.Name + "\\");
         }
         if((sr.Attr & faDirectory) == 0)
         {
         lista->Items->Add();
         lista->Items->Item[x]->Caption = Dir;
         lista->Items->Item[x]->SubItems->Add(sr.Name);
         Application->ProcessMessages();
         x++;
         }
        }
      while(FindNext(sr) == 0);
      FindClose(sr);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x = 0;
ListView1->Items->Clear();
FindDir(ListView1, "c:\\windows\\debug\\");   
}
//---------------------------------------------------------------------------
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
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez wargo » sobota, 23 sierpnia 2008, 13:00

Ja chcę aby były pliki i katalogi.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zawartość katalogu

Nowy postprzez Cyfrowy Baron » sobota, 23 sierpnia 2008, 13:07

Właściwie to masz już wszystko co potrzeba, ale niech będzie jeszcze jedna wariacja:

Kod: Zaznacz cały
int x;
void __fastcall FindDir(TListView *lista, String Dir)
{

  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
    {
      do{
       if(((sr.Attr & faDirectory) > 0) & (sr.Name != ".") & (sr.Name != ".."))
           {
         FindDir(lista, Dir + sr.Name + "\\");
         }
         if(sr.Name != "..")
         {
          if(sr.Name == ".")sr.Name = "<DIR>";
          lista->Items->Add();
          lista->Items->Item[x]->Caption = Dir;
          lista->Items->Item[x]->SubItems->Add(sr.Name);
          Application->ProcessMessages();
          x++;
            }

      }
      while(FindNext(sr) == 0);
      FindClose(sr);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x = 0;
ListView1->Items->Clear();
FindDir(ListView1, "c:\\windows\\debug\\");   
}
//---------------------------------------------------------------------------


i nie proś o więcej, bo tutaj masz już wszystko.
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
    NieznanyNieznana


  • 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 51 gości

cron