Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: VCL (C++ Builder) ::  Festplatte katalogisieren  
Gehen Sie zu Seite 1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Tim06TR
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2009
Beiträge: 1430
Beitrag Tim06TR Mitglied 21:05:35 11.08.2009   Titel:   Festplatte katalogisieren            Zitieren

Das ist eines der logistisch am schwersten zu lösenden Programme die ich jemals
geschrieben habe und fange jetzt schon zum dritten mal von vorne an.
Ich verlier mit der Zeit den Überblick in meiner Methode und beim "korrigieren"
mach ichs nur schlimmer.

Hier etwas Code:
DLB = DirectoryListBox
FLB = FileListBox
DOUT = DirectoryOutline
RICH = RichEdit
LB = ListBox
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void READ(void)
{
  Form1->RICH->Lines = Form1->FLB->Items;
  ShowMessage(Form1->RICH->Text.c_str());
  Form1->KomponentenNamen += Form1->RICH->Text.c_str();
}
void Child(void)
{
    std::string Parent = Form1->DLB->Directory.c_str();
    int Childreen = Form1->DLB->Items->Count - (Form1->DLB->ItemIndex);
    int i = 0;
    while (i < Childreen)
    {
        i++;
        ShowMessage("Child");
        Form1->FLB->Directory = Form1->DLB->Directory;
        READ();
        Form1->DLB->ItemIndex++;
        Form1->DLB->OpenCurrent();
        Form1->FLB->Directory = Form1->DLB->Directory;
    }
}
void Suchen(void)
{
       int Childreen = Form1->DLB->Items->Count - (Form1->DLB->ItemIndex);
       Form1->DESTICHILDCOUNT = Childreen;
       int i = 0;
       std::string DESTINATION = Form1->DLB->Directory.c_str();
       /*
       ShowMessage(DESTINATION.c_str());
       ShowMessage(IntToStr(Form1->DLB->Items->Count).c_str());
       ShowMessage(IntToStr(Form1->DLB->ItemIndex+1).c_str());
       */

       while (i < Childreen)
       {
           i++;
           ShowMessage("Call Child");
           Form1->Current_Child++;
           Child();
           Form1->DLB->ItemIndex--;
           Form1->DLB->OpenCurrent();
           int x = 1;
           while (x < Form1->Current_Child)
           {
               x++;
               Form1->DLB->ItemIndex++;
           }
       }
 
}
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
  DOUT->Directory = "C:\\A Katalogia Test MULTI";
  DLB->Directory = DOUT->Directory;
  DESTICHILDCOUNT = 0;
  Current_Child = 0;
  // SCHLEIFE !
  // ShowMessage("PAUSE");
  Suchen();
  RICH->Text = KomponentenNamen.c_str();
  LB->Items = RICH->Lines;
 
 
}
//---------------------------------------------------------------------------

ist etwas viel, lässt sich aber nicht lokal beschränken.
Ich lasse zum Test den Ordner "A Katalogia Test MULTI" katalogisieren.

in dem ordner sind die dateien Read Main 1.txt und Read Main 2.txt
dann sind darin noch zwei unterordner Child 1 und Child 2
in diesen sind jeweils wieder 2 Dateien.

Das Programm soll Jede Datei aus allen Ordner 1 mal in die Liste schreiben.
aber folgendes tut er:

Liest Dateien im Hauptordner
Liest 2* im ersten Unterordner
Liest Im Hauptordner
Liest 2* im ersten Unterordner
Liest im zweiten Unterordner

Was zu Hölle ist denn so komplett falsch an diesem Code und es sind vermutlich
mehrere Dinge.

(Wenn ihr mir ein paar Befehle geben könntet die das alles einfacher machen, wäre das sehr nett, denn mir fällt nur eine solche Lösung ein)

_________________
"Wie ein Komponist an seinem Klavier gleitet der Programmierer über die Tasten auf der Suche nach der perfekten Komposition" ~me --- Wehe ihr lest meine alten posts ! :D
Linnea
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.06.2004
Beiträge: 1600
Beitrag Linnea Mitglied 21:48:51 11.08.2009   Titel:              Zitieren

das geht wirklich bei dir so zu kompilieren? :eek:

ein Tip:
Verwende den Debugger statt der undefinierten ShowMessages, siehe hierzu auch den Beitrag in den FAQ.

[Edit1]der Fehler ist recht einfach: du liest bei beiden while-Schleifen auch die Unterordner immer wieder aus, also solltest du die Schleife nur in einer der Funktionen machen. Im Prinzip solltest du dich aber mal mit Rekursionen beschäftigen....

[Edit2]du kannst als Alternative zu den ganzen Komponenten natürlich auch mit FindFirst/FindNext arbeiten und dort die Suchkriterien entsprechend nach Verzeichnissen und Dateien einstellen. Hierbei ist eine Rekursion auf jdenfall sinnvoll. Ich glaub hier im Forum war auch schonmal ein ähnliches Beispiel...

_________________
Zitat von Joe_M. "... DAS WORT LINNEAS: Und es stand geschrieben in der Hilfe zum BCB soll er suchen, bis er fündig ward, oder dem Greisentum anheim fiel."


Zuletzt bearbeitet von Linnea am 06:20:49 12.08.2009, insgesamt 2-mal bearbeitet
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 2588
Beitrag Th69 Mitglied 10:44:10 12.08.2009   Titel:              Zitieren

Außerdem solltest du statt der freien Funktionen "Read", "Child" und "Suchen" besser Klassenmethoden erstellen. Dann benötigst du auch nicht immer den Zugriff mittels "Form1->" (und wenn schon dann übergib diesen als Parameter!!!)

Desweiteren sollten Funktionen ohne Parameter in C++ einfach als "()" und NICHT als "(void)" daklariert werden.

Am besten ist, du liest dich noch mal in die objektorientierte Programmierung ein. Evtl. erst mal ein einfacheres Programm programmieren, denn wie Linnea schon geschrieben hat, ohne Rekursion wirst du die Ordner und Dateien nicht korrekt auslesen können (und dazu gehört u.a. das Wissen umd die Verwendung von Funktionsparametern).

Sorry, ich weiß, jeder Anfang ist schwer, aber so ein Code-Gefrickel fördert nicht das Programmieren, sondern erzeugt mehr und mehr Frust (so wie ich deine Kommentare deute, ist es bei dir schon soweit).
Unregistrierter





Beitrag Unregistrierter 11:57:34 12.08.2009   Titel:              Zitieren

Gab es mit FindFirst/FindNext nicht Probleme in Verbindung mit einer rekursiven Funktion? Ich meine hier mal so was gelesen zu haben...

Wie auch immer, ich hab das mittels FindFirst/FindNext in Verbindung mit zwei TStirngList-Instanzen gelöst. Beim Einlesen mit FindFirst/FindNext prüfe ich ob, es eine Datei, oder ein Verzeichnis ist. Dateien kommen in die eine TStringList, Verzeichnisse in die andere TStringList. In der TStringList für Verzeichnisse trage ich das / die Startverzeichnis(se) ein. Wann immer ein weiteres Verzeichnis bei der Suche gefunden wird, wird es in diese Liste eingetragen. Wenn ein Verzeichnis komplett abgearbeitet ist, wird es aus dieser Liste gelöscht. Sobald diese Liste leer ist, ist die Suche komplett abgeschlossen.
Caster
Mitglied

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 76
Beitrag Caster Mitglied 15:04:00 12.08.2009   Titel:              Zitieren

Th69 schrieb:
Desweiteren sollten Funktionen ohne Parameter in C++ einfach als "()" und NICHT als "(void)" daklariert werden.


Das hab ich noch nie gehört. Ich hab gelesen, dass das bei C++ absolut keinen Unterschied macht. Bei C hingegen schon.
Tim06TR
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2009
Beiträge: 1430
Beitrag Tim06TR Mitglied 15:21:49 12.08.2009   Titel:              Zitieren

bei einem "()" statt "(void)" meckert er rum. ich weiß nicht was genau aber er will umbedingt, dass da etwas steht, sonst hat er "zu wenige Parameter".

Ja als Klassenmember... ja das wäre schlau gewesen mach ich gleich.

Rekursion, hört sich kompliziert an aber ich guck mirs mal an.

ich halt euch auf dem laufenden

_________________
"Wie ein Komponist an seinem Klavier gleitet der Programmierer über die Tasten auf der Suche nach der perfekten Komposition" ~me --- Wehe ihr lest meine alten posts ! :D
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11305
Beitrag akari Moderator 15:28:37 12.08.2009   Titel:              Zitieren

Hallo

Fakt ist : In C geht nur (void).
In C++ kann man (void) schreiben. Ist aber veraltet, man sollte immer () schreiben.

Wenn du in C++ "Fehler" bei () bekommst machst du irgendetwas falsch.

bis bald
akari

_________________
In der nächsten Version wird alles besser!
Tim06TR
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2009
Beiträge: 1430
Beitrag Tim06TR Mitglied 16:00:07 12.08.2009   Titel:              Zitieren

Bei Wikipedia habe ich folgendes zur Methode rekursiver Implementation ( :p ) gefunden:

Code:
1
2
3
4
5
6
7
8
 void fnTraverse( char* pString )
 {
   if( *pString == 0x0 )
     return;
   else
     // z. B. Buchstabe für Buchst. ausgeben
     fnTraverse( ++pString );
 }

Zitat:

++pString

:confused:
was zur hölle soll denn das (bringen)?

_________________
"Wie ein Komponist an seinem Klavier gleitet der Programmierer über die Tasten auf der Suche nach der perfekten Komposition" ~me --- Wehe ihr lest meine alten posts ! :D
akari
Moderator

Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11305
Beitrag akari Moderator 16:05:30 12.08.2009   Titel:              Zitieren

Hallo

Das gehört zum Thema Zeigerarithmetik. Der Wert von pString wird um eins erhöht und als Argument an den nächsten Aufruf von fnTraverse übergeben. Dadurch zeigt pString beim nächsten Aufruf auf das nächste Zeichen in der Zeichenkette.

bis bald
akari

_________________
In der nächsten Version wird alles besser!
txt
Unregistrierter




Beitrag txt Unregistrierter 17:04:42 12.08.2009   Titel:              Zitieren

Vielleicht kannst du das gebrauchen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void TextFileSearch(String Path,TStringList *files)
{
    Path=IncludeTrailingBackslash(Path);
    HANDLE FH;
    WIN32_FIND_DATA fdat;
    String Ffile=Path+"\\*";
    FH=FindFirstFile(Ffile.c_str(),&fdat);
    while (FindNextFile(FH,&fdat))
    {
        Ffile=fdat.cFileName;
        if (fdat.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && Ffile != ".."  && Ffile !=".")
        {
           TextFileSearch(Path+fdat.cFileName,files);
        }
        else if (ExtractFileExt(fdat.cFileName)==".txt")
        {
           files->Add(Path+fdat.cFileName);
        }
    }
    FindClose(FH);
}
c++.de :: VCL (C++ Builder) ::  Festplatte katalogisieren  
Gehen Sie zu Seite 1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.