| Autor |
Nachricht |
Tim06TR
Mitglied
Benutzerprofil
Anmeldungsdatum: 14.03.2009
Beiträge: 1427
|
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 !
|
|
 |
Linnea
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2004
Beiträge: 1600
|
Linnea Mitglied
21:48:51 11.08.2009 Titel: |
|
Zitieren |
das geht wirklich bei dir so zu kompilieren?
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: 2587
|
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
|
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
|
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: 1427
|
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 !
|
|
 |
akari
Moderator
Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11305
|
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: 1427
|
Tim06TR Mitglied
16:00:07 12.08.2009 Titel: |
|
Zitieren |
|
 |
akari
Moderator
Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11305
|
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
|
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);
} | | |
|
|
|
 |