Ftp Dir Listing auseinandernehmen

Gisl0r

Grünschnabel
Hi,

ich und ein Kumpel verzweifeln gerade dran ein FTP Dir Listing auseinander zu nehmen.

Code:
drwxr-xr-x  18 w0093f1d w0093f1d     4096 Aug 26 21:33 .
drwxr-xr-x   6 w0093f1d w0093f1d       52 Jan 23  2008 ..
-rw-r--r--   1 w0093f1d w0093f1d      111 Aug 23 14:50 .htaccess
-rw-r--r--   1 w0093f1d w0093f1d      825 Jan 23  2008 AdminSettings.sample
-rw-r--r--   1 w0093f1d w0093f1d    17997 Jan 23  2008 COPYING
-rw-r--r--   1 w0093f1d w0093f1d      162 Jan 23  2008 FAQ
-rw-r--r--   1 w0093f1d w0093f1d   236945 Jan 23  2008 HISTORY
-rw-r--r--   1 w0093f1d w0093f1d     3992 Jan 23  2008 INSTALL
-rw-rw-rw-   1 w0093f1d w0093f1d     4535 Jan 24  2008 LocalSettings.php
-rw-r--r--   1 w0093f1d w0093f1d      569 Jan 23  2008 Makefile
-rw-r--r--   1 w0093f1d w0093f1d     3535 Jan 23  2008 README
-rw-r--r--   1 w0093f1d w0093f1d    34280 Jan 23  2008 RELEASE-NOTES
-rw-r--r--   1 w0093f1d w0093f1d      603 Jan 23  2008 StartProfiler.php
-rw-r--r--   1 w0093f1d w0093f1d    12822 Jan 23  2008 Test.php
-rw-r--r--   1 w0093f1d w0093f1d    13195 Jan 23  2008 UPGRADE
-rw-r--r--   1 w0093f1d w0093f1d     2179 Jan 23  2008 api.php
-rw-r--r--   1 w0093f1d w0093f1d       28 Jan 23  2008 api.php5
drwxr-xr-x   2 w0093f1d w0093f1d       73 Jan 23  2008 bin
-rw-r--r--   1 w0093f1d w0093f1d        0 Aug 26 21:30 blaichbin keinordner
-rw-r--r--   1 w0093f1d w0093f1d        0 Aug 26 21:33 blaichbinkeinordner
drwxrwxrwx   2 w0093f1d w0093f1d       39 Jan 23  2008 config
drwxr-xr-x   4 w0093f1d w0093f1d     4096 Jan 23  2008 docs
drwxr-xr-x   3 w0093f1d w0093f1d       47 Jan 24  2008 extensions
-rw-r--r--   1 w0093f1d w0093f1d        0 Jan 24  2008 google93af59d50baabe6c.html
drwxrwxrwx   7 w0093f1d w0093f1d       75 Jan 31  2008 images
-rw-r--r--   1 w0093f1d w0093f1d     2474 Jan 23  2008 img_auth.php
-rw-r--r--   1 w0093f1d w0093f1d       35 Jan 23  2008 img_auth.php5
drwxr-xr-x   9 w0093f1d w0093f1d     8192 Jan 23  2008 includes
-rw-r--r--   1 w0093f1d w0093f1d     3218 Jan 23  2008 index.php
-rw-r--r--   1 w0093f1d w0093f1d       32 Jan 23  2008 index.php5
-rw-r--r--   1 w0093f1d w0093f1d     3772 Jan 23  2008 install-utils.inc
drwxr-xr-x   4 w0093f1d w0093f1d      114 Jan 23  2008 languages
drwxr-xr-x   2 w0093f1d w0093f1d       39 Jan 23  2008 locale
drwxr-x---   2 w0093f1d w0093f1d    12288 Aug 26 00:36 logs
drwxr-xr-x   8 w0093f1d w0093f1d     8192 Jan 24  2008 maintenance
drwxr-xr-x   2 w0093f1d w0093f1d     4096 Jan 24  2008 math
-rw-r--r--   1 w0093f1d w0093f1d     1532 Jan 23  2008 opensearch_desc.php
-rw-r--r--   1 w0093f1d w0093f1d     6173 Jan 23  2008 profileinfo.php
-rw-r--r--   1 w0093f1d w0093f1d      289 Jan 23  2008 redirect.php
-rw-r--r--   1 w0093f1d w0093f1d       35 Jan 23  2008 redirect.php5
-rw-r--r--   1 w0093f1d w0093f1d       91 Jan 23  2008 redirect.phtml
drwxr-xr-x   2 w0093f1d w0093f1d      106 Jan 23  2008 serialized
drwxr-xr-x   9 w0093f1d w0093f1d     4096 Jan 23  2008 skins
drwxr-xr-x   4 w0093f1d w0093f1d       57 Jan 23  2008 t
drwxr-xr-x   2 w0093f1d w0093f1d     4096 Jan 23  2008 tests
-rw-r--r--   1 w0093f1d w0093f1d     2746 Jan 23  2008 thumb.php
-rw-r--r--   1 w0093f1d w0093f1d       32 Jan 23  2008 thumb.php5
-rw-r--r--   1 w0093f1d w0093f1d     1373 Jan 23  2008 trackback.php
drwxr-xr-x   2 w0093f1d w0093f1d     4096 Aug 26 00:36 usage
-rw-r--r--   1 w0093f1d w0093f1d       88 Jan 23  2008 wiki.phtml

Am liebsten wärs mir ja wenn ich jeden Teil des aus jeder Zeilen einzelen in nem Array hab.

Kann mir jemand helfen wie ich das am besten Lösung, oder gibts das was vorgefertigtes?
 
du verwendest das fertige ftp-programm, oder?
da gibts auch lösungen im bereich wininet...einfach mal googlen
 
Hallo, ich bin der "Kumpel" vom Threadstarter ;-)
Zuerstmal die Infos:
Ich arbeite unter Linux mit C++ und libcurl als "FTP Client".

Also, ich muss sagen, dass mich das Teil die letzten 5 Tage bis früh morgens wachgehalten hat, da ich immer auf vermeintliche Lösungsansätze gestoßen bin, welche sich dann aber doch nicht als perfekt herrausgestellt haben. (Ziel ist es, den Ordnername herauszufiltern)
Ich vermute mal, dass das jetzt ein längerer Thread wird, da ich alle Probleme sehr genau erklären will.

Nehmen wir folgenden FTP Listing-Ausschnitt als Beispiel für den kompletten Thread:
Code:
-rw-r--r--   1 <username> <usergroup>      111 Aug 23 14:50 .htaccess
drwxr-xr-x   2 <username> <usergroup>       73 Jan 23  2008 Bin
-rw-rw-rw-   1 <username> <usergroup>     4535 Jan 24  2008 LocalSettings.php
-rw-r--r--   1 <username> <usergroup>    13195 Jan 23  2008 UPGRADE
-rw-r--r--   1 <username> <usergroup>     2179 Jan 23  2008 api.php
-rw-r--r--   1 <username> <usergroup>       28 Jan 23  2008 api.php5
-rw-r--r--   1 <username> <usergroup>        0 Aug 26 21:30 blaichbin keinordner
-rw-r--r--   1 <username> <usergroup>        0 Aug 26 21:33 blaichbinkeinordner
-rw-r--r--   1 <username> <usergroup>        0 Sep 05 02:11 blah:blah
drwxrwxrwx   2 <username> <usergroup>       39 Jan 23  2008 config
drwxr-xr-x   4 <username> <usergroup>     4096 Jan 23  2008 docs
drwxr-xr-x   4 <username> <usergroup>       57 Jan 23  2008 t
drwxr-xr-x   2 <username> <usergroup>     4096 Jan 23  2008 tests
(Werte sind in einem vector<string> filelistdirty gespeichert, jede Zeile = ein Feld im vector)

Ich habe ebenfalls die Möglichkeit, mir nur ein pures Directory Listing ausgeben zu lassen, in dem nur die Namen stehen, das allerdings anders sortiert ist, als das obere.
(Werte sind ebenfalls in einem vector<string> dirlistonly gespeichert, jede Zeile = ein Feld im vector)
Code:
api.php
api.php5
Bin
blaichbin keinordner
blaichbinkeinordner
blah:blah
config
docs
t
tests
.htaccess
LocalSettings.php
UPGRADE


*nach 15minuten schreiben alles ab hier weggelöscht hat*

Naja, ich merke gerade, dass ich mittlerweile vor lauter denken schon so einen Blackout habe, dass ich nichtmal mehr sinnvolle Sätze schreiben kann, in denen ich meine bisherigen Ansätze beschreibe.

Naja, kurzfassung mit etwas Pseudocode, da tu ich mir leichter und ihr versteht's vermutlich auch eher:
Code:
int i2=0;
for(int i=0; i<filelistdirty.size(); i++) {
  while(filelistdirty[i].rfind(dirlistonly[i2])==string::npos) {
    i2++; // ich weiß, ab hier fehlen ein paar überprüfungen und so, aber die waren eingebaut. soll ja nur pseudocode sein
  }
  filelistclean.push_back(dirlistonly[i2]);
}
So sollte er eigentlich alle strings von filelistdirty darauf überprüfen, ob ein Name von dirlistonly übereinstimmt und wenn ja das ganze in filelistclean packen (die ist dann so sortiert wie filelistdirty).
Einige werden sich jetzt vielleicht fragen, warum ich das so kompliziert mach und nicht gleich die Ergebnisse von dirlistonly nehm: ich muss zwischen Ordner und Datei unterscheiden können (das funktioniert schon), das ganze steht im vector<bool> isdirectory und ist dann ebenfalls so sortiert wie filelistdirty (macht ja Sinn).

Dann noch zu den "einfachen" Methoden, die mir bis jetzt auch schon oft vorgeschlagen wurden (ich will nicht, dass mir das nochmal vorgeschlagen wird *g*), aber verständlicherweise nicht funktionieren.

1. "Les doch einfach von hinten die Position des ersten Leerzeichens aus und alles ab da bis zum Ende (\0) ist dann dein Datei/Ordnername".
- Gut, funktioniert auch wunderbar! .. solange, bis im Datei/Ordnername (in zukunft: nurnoch Dateiname) ein Leerzeichen vorkommt (siehe Listing oben).

2. "Guck doch von hinten, wo der erste Doppelpunkt ist, da weißte dann, dass da die Uhrzeit ist, und dann gehste einfach noch die Zeichen (sind ja immer gleichviele) weiter hinter, bis du am Dateinamen bist. Wenn kein Doppelpunkt (ergo: keine Uhrzeit) da ist, guckst du, ob du ein Jan, Feb, ..., Dez, findest und gehst von da aus eben die Anzahl von Zeichen hinter"
- Funktioniert reintheoretisch auch sehr gut. Aber wieder mehrere Probleme. Der Dateiname könnte ein Doppelpunkt enthalten, der Dateiname könnte eine Zeichenkette Jan, Feb, ..., Dez enthalten. (Bsp. Dateiname "Mayor") und somit die Rückgaben wieder verfälschen. Von vorne würd's auch nicht gehen, da der Username oder die Usergroup das gleiche Problem machen könnten.

3. Ach, ich hab schon soviel ausprobiert und rumprobiert, bin jetzt eigentlich mit meinen Latein am Ende und will hier auch garnicht mehr hinschreiben, da das sonst wirklich dem Rahmen dieser Nacht sprengen würde *g* (Hab alles mögliche ausprobiert)



Das einzigste was mir jetzt noch während des Schreibens eingefallen ist: ich könnte dirlistonly so sortieren, wie filelistdirty sortiert ist. dann dürfte das alles kein Problem mehr sein. Aber das würde ja sowas von aufwendig werden. Erst alle Dateien mit 'nem "." vorne dran nach ganz oben (sollten es mehrere sein gilt auch: alphabetisch sortieren), dann alle Dateien, deren 1. Buchstabe großgeschrieben ist nach oben (unter .) und alphabetisch sortieren, dann alle Buchstaben, deren 1. Buchstabe klein ist unten dranhängen und auch alphabetisch sortieren. Da biegen sich bei mir die Fingernägel während dem Schreiben :-\
Oder gibt's da evtl. schon ne fertige Funktion, die einem sowas abnimmt? Die alten Strings aus vector<string> dirlistonly; eben sortiert in vector<string> dirlistonlysorted; schreiben.



Naja, ich hau mich jetzt auf's Ohr, viel Programmieren schadet der Gesundheit [zumindest wenn man immer kurz vor nem Erfolgserlebnis wieder enttäuscht sehen muss, dass man wieder etwas übersehen hat und es so nicht geht]


Falls das hier jemand lesen sollte und es auch verstanden haben sollte: Vielen Dank! Solltest du mir dann auch noch helfen können, wäre ich noch viel viel dankbarer. ;-)


Edit:
GOTT SEI DANK!
Es geht!

api.php5 Ordner: 0
bin Ordner: 1
blaichbin keinordner Ordner: 0
blaichbinkeinordner Ordner: 0
config Ordner: 1
docs Ordner: 1
extensions Ordner: 1
googleaac.html Ordner: 0
images Ordner: 1


Die Lösung war viel simpler, als ich es mir vorstellte. Bin nochmal alles in Ruhe durchgegangen und hatte mir folgenden Text konstruiert:
Ein Verzeichnis/eine Datei sieht entweder so
"drwxr-x--- 2 <username> <usergroup> 12288 Sep 5 00:34 logs"
oder
"drwxr-xr-x 9 <username> <usergroup> 8192 Jan 23 2008 includes"
so aus. Würde man überall, wo mehrere Leerzeichen sind, nur eines zählen, so würde man auf 8 Leerzeichen bis zum Verzeichnis/Dateiname kommen. D.h. ich muss von links anfangen und Buchstabe für Buchstabe durchgehen. Wenn er ein Leerzeichen findet, soll er einen Counter um 1 hochzählen - aber nur dann, wenn das nächste Zeichen kein Leerzeichen ist! Wenn ich dann bei 8 angekommen bin, hab ich die position von dem Verzeichnis/Dateinamen und kann ihn von da aus bis zum Ende auslesen.

Und siehe da, exakt so funktionierts auch tadellos :) Trotzdem danke an euch - aber manchmal hat man doch recht gute Geistesblitze ;-)

Edit2:
NEEEEIN! Der komplette Ansatz ist durchweg ungenügend. Sobald ein Username oder die Usergroup ein Leerzeichen beinhaltet (was ja durchaus möglich sein kann), ist die komplette Auswertung durcheinander... :-(
 
Zuletzt bearbeitet:
Erstmal, so arg aufwendig wäre eine selbstgebaute Sortierung auch wieder nicht.

Zum Zweiten, wenn ich das richtig sehe beginnt der Dateiname immer beim gleichen Zeichen, sprich, Tabelle, du müsstest also nur in EINER Zeile den Beginn vom Dateinamen finden, in allen anderen Zeilen beginnt er beim gleichen Zeichen.

Falls ich das nicht richtig sehe hast du auch noch Möglichkeit 3.
Einfach auch vom isdirectory einen zweiten "clean" vector erstellen:

Code:
int i2=0;
for(int i=0; i<filelistdirty.size(); i++) {
  while(filelistdirty[i].rfind(dirlistonly[i2])==string::npos) {
    i2++; // ich weiß, ab hier fehlen ein paar überprüfungen und so, aber die waren eingebaut. soll ja nur pseudocode sein
  }
  filelistclean.push_back(dirlistonly[i2]);
  isdirectoryclean.push_back(isdirectory[i2]);
}

Gibt aber auch ein Problem, wenn ein Dateiname in einem Usernamen vorkommt.
Im Zweifelsfalle würde ich zum user defined sort raten, das erspart dir zumindest jetzt das Kopfzerbrechen.
 
Zurück