Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 15:01

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Spacing eines FTP-Servers ?!?
BeitragVerfasst: Mo Nov 17, 2003 16:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Hi !!
Ich hab ein Problem...

Ich will, dass mein Programm die Größe ALLER Datein von einem FTP-Server ( Die Verbindung hab ich mit Indys FTP... ) zusammenrechnet...
So eine Art Space-Scanner also...

Mein Problem: Ich bekomm keine Schleife hin, die auch ALLE Unterordner durchsucht, da es beim FTP kein FindFirst / FindNext zu geben scheint (oder zumindest in Verbindung mit Indy nicht)...... Kann mir einer Helfen ???
thx fürs Lesen... Cya !

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 19:31 
Offline
DGL Member

Registriert: Di Okt 29, 2002 21:20
Beiträge: 30
Am besten lässt sich sowas meiner meinung nach rekursiv lösen...
Du überprüfst einfach ob das aktuelle "File" nen Verzeichnis ist, und wenn dies der fall ist, rufst du die funktion zum listen der dateien mit dem neuen verzeichnis als parameter auf und gibst am ende der funktion die errechnete grösse zurück...
Damit solltest du, wenn alle funktionen beendet sind und ihre werte zurückgegeben haben, die gesamtgrösse des unterordners haben...

_________________
Knowledge is Power - So ask if you want to become powerful


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 20:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
man müsste den order öffnen um den inhalt zu sehen... (allein wegen den unterordnern...)
man kann die Größe eines Ordners bei FTP NICHT herausfinden.. nur indem man den inhalt addiert... ( bei unterordnern dann wieder und wieder...)
das Problem: man hat nen unterordner fertig, geht wieder einen ordner drüher und weis nich mehr wo man dran war...

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 20:59 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
NiGhTmArE hat geschrieben:
drüher und weis nich mehr wo man dran war...

Na dann solltest du dir mal über die Möglichkeiten der Rekursion in Delphi klar werden. Das ist nämlich leichter als du denkst, da Delphi eine so tolle sprache ist, dass sie von selbst einen Stack mitführt, der sowas kann ;-) Stichwort: Gültigkeitsbereich von Variablen..

Tipp: Programmieren mit Oberon-2 unter Windows
ISBN 3-446-18406-6
1995 Hanser Verlag, Mühlbacher/Leisch/Kreuzeder, S. 143-166
ich glaube das war eines(das?) der bücher, mit denen ich mir das damals beigebracht habe... hoi ist das lange her. ist zwar oberon, aber das sollte verstehbar sein. vielleicht kann man das buch noch irgendwo bekommen, oder ausleihen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Ja das hab ich auch schon überlegt, aber man bekommt vom FTP Server
ja nur den aktuellen Server + Inhalt und keinen fertigen Tree (, den man für das Recurse benötigt <-- is doch so oder ? ).

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 21:18 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
wenn du einen fertigen baum bekommen würdest, wäre rekursion nur wenig sinnvoll.... aber beid einem problem ist rekursion sinnvoll eingesetzt, wenn du dich einzeln durch die verzeichnisse hangeln musst


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 21:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
aso... ich hab mir das noch nich so angeguckt... in der delphi hilfe is das irgendwie knapp gekommen ^^
thx ich such ma bissel @ google...

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 17, 2003 22:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Hab mir das ma angeguckt ..
hatte folgendes Beispiel:
Code:
  1. procedure GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);
  2. var
  3.   SR: TSearchRec;
  4. begin
  5.   if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'') then
  6.     ADirectory:=ADirectory+'';
  7.  
  8.   if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then begin
  9.     repeat
  10.       if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then
  11.           AList.Add(ADirectory+SR.Name)
  12.     until FindNext(SR)<>0;
  13.     FindClose(SR);
  14.   end;
  15.  
  16.   if ARekursiv then
  17.     if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
  18.     begin
  19.       repeat
  20.         if (SR.Name<>'.') and (SR.Name<>'..') then
  21.           GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True);
  22.       until FindNext(SR)<>0;
  23.       FindClose(SR);
  24.     end;
  25. end;
  26.  

is das das,was du meinst ?
Wenn ja, da benötigt man wies aussieht findfirst und fundnext... aber die gehen ja auf nem ftp nich (sagen mir meine tests ^^ <-- nich 100% sicher das is problem ! )
cya !

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 18, 2003 00:35 
Offline
DGL Member

Registriert: Di Okt 29, 2002 21:20
Beiträge: 30
Also ich hab mir mal die Indy Komponente angesehen und was die da liefert is Grütze meiner Meinung nach :P
Mit dem detaillierten Listing kannste nicht viel anfangen ohne es zu parsen und bei dem ohne Details weisst du nicht was da nen Verzeichnis ist und was nicht.
Das lässt sich allerdings mit ner geringfügigen Änderung des Aufrufes der List-Prozedur bewerkstelligen:

Code:
  1.  
  2. FTP.List(StrList1,'',FALSE); //Liefert Dateien + Verzeichnisse
  3. FTP.List(StrList2,'*.*',FALSE); //Liefert nur die Dateien
  4.  

Die beiden Stringlisten dann vergleichen und schon haste nur die Verzeichnisse (sollte zumindest so sein *g*)

Aber weiter zur Rekursion:
In deiner selbstgeschriebenen Funktion holst du dir wie oben gezeigt die Verzeichnisse und gehst die dann systematisch durch...
z.B. folgendermaßen:

Code:
  1.  
  2. function GetDirSize(Dir: String): Cardinal;
  3. begin
  4. ftp.ChangeDir(Dir);
  5. .
  6. .
  7. .
  8. for i := 0 to DirList.Count - 1 do
  9. begin
  10.   DirSize := DirSize + GetDirSize(DirList.Strings[i]);
  11. end;
  12. .
  13. //Hier die Dateigrössen lesen und schön auf DirSize addieren...
  14. .
  15. Result := DirSize;
  16. end
  17.  

Das ist jetzt ausm Kopf runtergetippert, habs nicht getestet, is evtl. noch ein wenig debuggen nötig, aber im groben sollte es so funktionieren (wer den Drang verspürt mich für den geposteten Code schlagen zu müssen, dem wünsch ich viel Spass dabei *sich.schonmal.bewaffnet*).
Rekursion ist einfach nichts anderes, als dass sich eine Funktion immer wieder selbst aufruft, bis irgendeine Abbruchbedingung erfüllt ist (hier in unserem Fall heisst das, in einem Unterverzeichnis sind keine weiteren Verzsichnisse mehr vorhanden). Dann "kehren" all die aufgerufenen Funktionen zurück und geben ihre errechneten Werte an die "übergeordnete" Funktion zurück.

Hoffe ich hab das verständlich genug runtergetippert, sollten noch fragen sein, schrei mich an :)

_________________
Knowledge is Power - So ask if you want to become powerful


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 18, 2003 21:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
So inetwa hab ich mir das auch schon gedacht...
aber der LIST-Befehl gibt nur Dateien aus dem aktuellen Ordner wieder !
Mann müsste bei jedem Ordnerwechsel ( also in Unterordner ) neu LISTen und das ganze ... da liegt das Problem...
achso und Indy is cool *gg*
vFTP.List(StrList1,'*',FALSE); //Liefert Verzeichnisse ( aber nur die, des derzeitigen Ordners <- da is das Prob![/pascal]

Ausserdem gibts nen fertige Funktion die das ganze Parst ! Hab aber Name grad nich im Kopf... gibts aber mien ich !

thx und cya !

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 18, 2003 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Hab da was gefunden...
ma sehen ob man damit was anfangen kann...
http://beta.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20659925.html

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 18, 2003 21:49 
Offline
DGL Member

Registriert: Di Okt 29, 2002 21:20
Beiträge: 30
Ich glaube du hast das mit dem rekursiven immer noch nicht ganz verstanden *g*
Du brauchst in dem Moment die Unterverzeichnisse der Verzeichnisse im aktuellen Verzeichnis (hö ? ;P) ja auch nicht...
Dafür ist ja die Rekursion zuständig.
Du lässt dir die Unterverzeichnisse des aktuellen Verzeichnisses auflisten, und rufst dann innerhalb der Funktion die selbe Funktion nochmal auf.

Nochmal der Code mit etwas mehr Kommentaren:
Code:
  1.  
  2. { Die Funktion bekommt als Parameter das Verzeichnis,
  3. welches durchsucht werden soll, und gibt die Gesamtgröße der Dateien
  4. in diesem Verzeichnis zurück }
  5. function GetDirSize(Dir: String): Cardinal;
  6. var DirList: TStringList;
  7. begin
  8. ftp.ChangeDir(Dir); //In das an die Funktion übergebene Verzeichnis wechseln
  9. DirList := TStringList.Create;
  10. ftp.List(DirList,'*',FALSE); //Die Verzeichnisse listen lassen und das Ergebnis in DirList speichern
  11. for i := 0 to DirList.Count - 1 do
  12. begin
  13.   DirSize := DirSize + GetDirSize(DirList.Strings[i]);
  14. {
  15. Hier kommt die Rekursion zum tragen. Wenn das aktuelle Verzeichnis Unterverzeichnisse hat, ruft sich die Funktion mit einem dieser Unterverzeichnisse als Parameter wieder auf. Damit wird gewährleistet, dass alle vorhandenen Unterverzeichnisse bearbeitet werden. Die vorherigen Ergebnisse bzw. Funktionsaufrufe werden im Speicher gehalten, da diese ja noch nicht beendet sind.
  16. }
  17. end;
  18. .
  19. //Hier die Dateigrössen lesen und schön auf DirSize addieren...
  20. .
  21. Result := DirSize; //Am Ende geben wir gekonnt die Gesamtgröße zurück
  22. end;
  23.  


Sagen wir mal, du hast folgenden Verzeichnisbaum:
Code:
  1.  
  2. /
  3. |_Verz1
  4. ||_UVerz1
  5. ||_UVerz2
  6. | |_UUVerz1
  7. |_Verz2
  8.  

Dann läuft das ganze folgendermaßen ab:
Verzeichnis "/" wird gelistet und das Programm sieht, aha, wir haben 2 Verzeichnisse (Verz1 und Verz2). DirList sieht dann also so aus:
DirList.Strings[0] = 'Verz1';
DirList.Strings[1] = 'Verz2';

Beim ersten Durchlauf der schleife hätten wir also quasi folgenden Aufruf:
DirSize := DirSize + GetDirSize('Verz1');
Die Funktion ruft sich also selbst neu auf und wir wechseln am Anfang in das neue Verzeichnis.
Danach werden dort alle Unterverzeichnisse gelistet.
Das wäre dann:
DirList.Strings[0] = 'UVerz1';
DirList.Strings[1] = 'UVerz2';
Also haben wir wieder 2 Unterverzeichnisse und die Funktion ruft sich wieder selbst auf, diesmal mit 'UVerz1' als Parameter.
Dort werden diesmal keine Unterverzeichnisse gefunden, die Funktion addiert die Dateigrößen und gibt sie an die aufrufende Funktion zurück.
Dort wird nun die errechnete Dateigröße auf DirSize addiert und es folgt der 2. Durchlauf der Schleife.
DirSize := DirSize + GetDirSize('UVerz2');
Dort wird ein Unterverzeichnis gefunden und die Funktion wiederum mit einem neuen Parameter aufgerufen:
DirSize := DirSize + GetDirSize('UUVerz1');
Hier wieder keine neuen Verzeichnisse, aber dafür Dateien. Diese werden wieder addiert, das Ergebnis zurückgegeben und auf DirSize addiert.
Danach wird wieder in die Funktion zurückgekehrt, welche 'UVerz2' als Parameter hatte. Hätten wir noch mehr Unterverzeichnisse, würde ein weiterer Aufruf der Funktion folgen, da das aber nicht der Fall ist, werden alle Dateigrößen auf DirSize addiert und das Ergebnis wiederum an die übergeordnete Funktion zurückgegeben.

Ich hoffe du hast jetzt verstanden wie das ganze funktioniert. Alle "übergeordneten" Funktionen gehen nicht verloren, sondern werden im Speicher gehalten, da sie ja noch nicht beendet sind, sondern nur solange pausiert, bis eine untergeordnete Funktion mit ihrer Arbeit fertig ist und das Ergebnis zurückgibt. Dann setzen Sie Ihre Aufgabe an der Stelle fort, wo sie stehengeblieben waren.

Habe grad mal aktualisiert und gesehen dass du den Link gepostet hast. Kannste sicher benutzen, ist aber im Grunde nichts anderes als das, was ich dir da zusammengetippt habe und ausserdem will ich, dass du das ganze auch verstehst :)

_________________
Knowledge is Power - So ask if you want to become powerful


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 21, 2003 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Feb 25, 2003 15:10
Beiträge: 147
Wohnort: Koblenz a. Rhein
Achsoooo ^^
Wir ham da aneinander vorbei geredet beim Problem ^^
Aber die Lösung is gut ^^ Danke !
Ich hab gedacht, wenn sich die Funktion selber aufruft und fertig ist, ist "i" wieder bei "0" in der Schleife... aber es macht da weiter, wo es aufgehört hat ^^
das meinte ich ^^
Danke !

_________________
mir fällt kein Spruch mehr ein für meine Signatur :( naja... :D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]