In Bezug auf die Mehrfachauswahl von Dateien UND Verzeichnisse
über QFileDialog und dem rekursiven auslesen von Verzeichnissen
hatte ich hier im Forum gepostet und eine Lösung gefunden.
(Danke Christian !)
Über google fand ich dahingehend lediglich die gleichen Fragen von Entwicklern statt Antworten.
Auch hier im Forum wird ja viel nach der "gemischten Mehrfachauswahl"
über QFileDialog gefragt, daher stelle ich hier mal ein snipped ein.
Problemstellung:
----------------------------------------------------------------------------------------------
Über QFileDialog Dateien und/oder Verzeichnisse auswählen und
die Dateinamen (inklusive Pfad) in einem QStringList Objekt
ablegen. Verzeichnisse sollen rekursiv (also auch deren Unterverzeichnisse) durchsucht werden und in einer ListView angezeigt werden.
SLOT: void onAdd();
Funktionen:
void onAddFiles( QString files );
void onAddFolders( QString folders );
void onUpdateList();
Variablen:
QStringList m_fileList;
QListView m_ctrlFileView;
Klasse: MainFrm ( mainfrm.cpp, mainfrm.h )
Code: Alles auswählen
/**
QFileDialog aufrufen, Dateien/Verzeichnisse wählen
und ermittelte Werte an 'onAddFiles( QString files )'
übergeben
*/
void MainFrm::onAdd()
{
QStringList filterlist;
QString filters = filterlist.join( ";;" );
QStringList filenames;
filenames = QFileDialog::getOpenFileNames( filters, QString::null, this, 0, tr("Add") );
QStringList::Iterator it = filenames.begin();
while( it != filenames.end() )
{
// m_fileList füllen
onAddFiles( *it );
++it;
}
onUpdateList();
filenames.clear();
}
/**
den in "file" übergebenen Wert in m_fileList ablegen,
wenn Verzeichniss dann onAddFolders( QString folders )
aufrufen.
*/
void MainFrm::onAddFiles( QString file )
{
QFileInfo f( file );
if ( f.isFile() )
{
//wir wollen Dateiname + Pfad
m_fileList.append( f.absFilePath() );
}
else if ( f.isDir() )
{
onAddFolders( file );
}
}
/**
Verzeichniss auslesen, wenn Unterverzeichniss
auch deren Inhalt ermitteln und an m_fileList
anhängen
*/
void MainFrm::onAddFolders( QString folder )
{
QDir d ( folder );
if ( !d.exists() )
{
QMessageBox::information( this, "Error", "Can't open folder");
exit( 1 );
}
d.setFilter( QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks );
d.setMatchAllDirs( true );
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list );
QFileInfo *fi;
for ( ; ( fi = it.current() ) != 0; ++it )
{
// "." und ".." brauchen wir nicht..
if ( fi->fileName() == "." || fi->fileName() == ".." )
continue;
else if ( fi->isDir() )
// win-user benutzen nat. "\\"
onAddFolders( fi->absFilePath() + "/" );
else if( fi->isFile() )
m_fileList.append( fi->absFilePath() );
}
}
/**
Listenansicht aktualisieren und ermittelte
Dateien anzeigen
*/
void MainFrm::onUpdateList()
{
QStringList::Iterator it = m_fileList.begin();
while( it != m_fileList.end() )
{
QListViewItem *item = new QListViewItem( m_ctrlFileView );
item->setText( 0, *it ); // Column 0 = "Filename"
++it;
}
}
Nun, manchmal ist es nötig Dateien zu einem Archiv zusammen zu packen,
Dateien nach einem bestimmten Inhalt zu durschsuchen, Dateien eines
Ordners mit dem eigenem Algorithmus sicher zu löschen u.s.w., u.s.w.
Also dann, hoffe ich konnte ein parr offene Fragen der Gemeinde klären,
ron