PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateinamen splitten -> item->QListView???



doitux
13-02-2004, 15:16
Hallo Leute

Ich bin noch ein ziehmlicher Frischling in Sachen QT und stoße mal wieder an meine Grenzen. Vielleicht hat ja jemand von euch eine Idee wie ich das angehen könnte.

Ich bastle gerade an einem Programm welches mir im /tmp/-verzeichnis script-dateien generiert die ich dann über "at" ausführen lasse.
so eine script-datei hat z.b. folgenden Namen:

videorectimer-film1-13:08:2004-13:26-01:30:00

Ich möchte jetzt gerne alle Dateien in "/tmp" die mit videorectimer beginnen ("videorectimer*") rausfiltern (das klappt auch schon mit *tmpinhalt = dir->entryList( "videorectimer*" );) und dann möchte ich die details aus dem dateinamen wie z.b. Filmname: "film1" oder StartDatum: 13.08.2004 oder StartZeit: 13:26 Uhr als items in eine liste = new QListView einfügen.

ich hab schon viel mit join() und find() probiert bin aber letztendlich gescheitert.

Da das ganze ein Videorecorder werden soll, wollte ich gerne über einen hinzufügen-Button die Programmierjobs in die liste einfügen (im hintergrund wird ein script generiert und der at-befehl ausgeführt) und bei bedarf wollte ich die jobs auch wieder löschen. Außerdem muss ja am Start des Programmes die ganze Dateiliste wieder eingelesen werden damit die liste aktuelle ist.

Warscheinlich bin ich das ganze viel zu kompliziert angegangen.
Hat jemand eine Idee was ich versuchen könnte?
Bei bedarf kann ich auch ein tarball als dateianhang posten.

vielen dank
doitux

tuxipuxi
13-02-2004, 15:39
hi,

die beiden methoden die mir einfallen sind
a) über die üblichen QString methoden( find und sowas), vorteil: leicht nachteil: recht umständlich.
b) über QRegExp vorteil: extrem umfangreiche methoden des string matching und der string manipulation nachteil: eindeutig schwerer als über QString methoden.

mit QRegExp hab ich noch nicht wirklich gearbeitet, also kann ich dir da keine hilfestellung leisten. die einführung in der Qt Doku ist aber sehr umfangreich. wie das mit QString methoden geht, weiss ich, aber bevor ich dir da eine eventuell umständliche lösung präsentiere, warte ich lieber auf die idee unseres Qt Meisters anda_skoa :).

gruss,
michael.

doitux
13-02-2004, 15:47
hi!

wenn du das sagst dann warte ich auch mal auf anda_skoa ;-)
aber danke dass du dich trotzdem gemeldet hast. damit weiss ich wenigstens dass die frage nicht ganz so blöd war.

meinst du ich soll den quellcode als anhang posten, oder macht man sowas nur nach aufforderung?

viele grüße
felix

anda_skoa
14-02-2004, 14:09
Also für QRegEx müsste ich jetzt auch nachschauen.
Mein Ansatzt wäre QStringList::split mit "-" als Trennzeichen.
Dann kann man die Zeit bzw die beiden Datums nochmla getrennt bearbeiten, eventuell kann QDate/QTime/QTDateTime das dann schon selbst.

Ciao,
_

doitux
14-02-2004, 23:18
ok ich werd's nochmal mit split() versuchen. wenn ihr es auch so machen würdet dann besteht ja doch ne chance das es klappt

wünscht mir glück ;-)
felix

doitux
15-02-2004, 00:11
hallo nochmal.
ich bin jetzt glücklicherweise auf den Iterator gestoßen. damit könnte das glaub ich ganz gut gehen.

inzwischen hab ich mal folgendes probiert:

dir = new QDir;
*dir = "/tmp" ;
tmpinhalt = new QStringList;
*tmpinhalt = dir->entryList( "videorectimer*" );
tmpinhalt->sort();

eintmpinhalt = new QStringList;

for ( QStringList::Iterator it1 = tmpinhalt->begin(); it1 != tmpinhalt->end(); ++it1 ) {
cout << *it1 << "\n ";
*eintmpinhalt = it1.split("-");
for ( QStringList::Iterator it2 = eintmpinhalt->begin(); it2 != eintmpinhalt->end(); ++it2 ) {
cout << *it2 << "\n ";

}
}

ich hab mal cout genommen um erstmal zu testen was bei dem ganzen gesplitte rauskommt. das " cout << *it1 << "\n ";" klappt wunderbar. dabei bekomme ich eine liste mit den dateinamen aufgelistet. aber mit dem "*eintmpinhalt = it1.split("-");" gibts folgendes problem:

videorec.cpp:166: error: `split' undeclared (first use this function)
videorec.cpp:166: error: (Each undeclared identifier is reported only once for each function it appears in.)

ich hab <qstringlist.h> aber includet. meines wissens ist split doch eine funktion von QStringList.
wißt Ihr was ich da machen kann?

vielen dank
felix

tuxipuxi
15-02-2004, 10:47
hi doitux,

mit folgendem beispielprogramm kriegst du die gesplitteten dateinamen:



#include <qstringlist.h>
#include <qdir.h>

#include <iostream>
using namespace std;

int main( int argc, char* argv[] )
{

QDir dir( "." );

QStringList files = dir.entryList( "videorectimer*" );

for( QStringList::Iterator iter = files.begin(); iter != files.end(); ++iter )
{
QStringList current = QStringList::split( "-", *iter );
for( QStringList::Iterator iter2 = current.begin(); iter2 != current.end(); ++iter2 )
{
cout << *iter2 << endl;
}
}
}


bei diesem ordnerinhalt:



a.out videorectimer-film1-13:08:2004-13:26-02:30:00
main.cpp videorectimer-film1-13:09:2004-13:26-02:30:00
videorectimer-film1-12:09:2005-13:26-02:30:00 videorectimer-film1-13:09:2005-13:26-02:30:00
videorectimer-film1-13:08:2004-13:26-01:30:00


habe ich folgende ausgabe:



videorectimer
film1
12:09:2005
13:26
02:30:00
videorectimer
film1
13:08:2004
13:26
01:30:00
videorectimer
film1
13:08:2004
13:26
02:30:00
videorectimer
film1
13:09:2004
13:26
02:30:00
videorectimer
film1
13:09:2005
13:26
02:30:00


das dürfte das sein, was du haben wolltest.

zu deinem code:



ich hab <qstringlist.h> aber includet. meines wissens ist split doch eine funktion von QStringList.
wißt Ihr was ich da machen kann?


ja, ist eine QStringList funktion. wenn du sie aber auf das objekt anwendest, auf das der iterator zeigt, wendest du sie auf einen QString an.




dir = new QDir;
*dir = "/tmp" ;


sehr umständlich, die location kannst du im konstruktor übergeben.

gruss,
michael.

anda_skoa
15-02-2004, 13:01
Original geschrieben von tuxipuxi
ja, ist eine QStringList funktion. wenn du sie aber auf das objekt anwendest, auf das der iterator zeigt, wendest du sie auf einen QString an.

In seinem Fall sogar auf den Iterator.

split einfach immer mit QStringList:: benutzen, dann kann man da nix verwechseln (sie ist ja eine static Methode).



sehr umständlich, die location kannst du im konstruktor übergeben.


Ganz abgesehen davon, dass diese Variablen alle lokal sind, also nur in dieser Funktion gebraucht werden.
Da ist ein Pointer ziemlich überflüssig, erzeugt bloß das Problem, dass man delete nicht vergessen darf.

Also


QDir dir("/tmp");

bzw.


QStringList tmpinhalt = dir.entryList("videorectimer");


Ciao,
_

doitux
15-02-2004, 17:42
vielen dank für die tips. ihr seid echt goldwert ;-)
das mit den lokalen variablen werde ich auch gleich mal programmweit überprüfen.

viele grüße
felix