Russian Qt Forum

Qt => Общие вопросы => Тема начата: izoomer от Октября 05, 2007, 13:01



Название: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: izoomer от Октября 05, 2007, 13:01
во такой код работает нормально если в папке нет подпапок, однако если есть подпапка то прога вообще вылетает
Код:
int JExplorer::sizeDir( QString dirName )
{
QString cat, eString, exclude="";
int size = 0, sizeTotal = 4096;
QDir d;
QFileInfoList list;
if ( d.cd( path ) ) {
d.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );
d.setSorting( QDir::Name ); 
list = d.entryInfoList();
if ( list.size() != 0 ) { 
foreach ( QFileInfo fi, list  ) { 
cat = fi.fileName();
if ( ( cat!="." ) && ( cat!=".." ) && ( cat != exclude ) ) { 
if ( fi.isDir() ) {
size = sizeDir( path + "/" + cat );
} else size = (int)fi.size();
sizeTotal = sizeTotal + size;
}
}
}
}
            return sizeTotal;
}



Название: Re: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: Dodge от Октября 05, 2007, 13:24
Попробуй это, должно работать
Код:
quint32 listFolder ( QString path ) {
QDir currentFolder( path );

quint32 totalsize = 0;                     

currentFolder.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );
currentFolder.setSorting( QDir::Name );

QFileInfoList folderitems( currentFolder.entryInfoList() );

foreach ( QFileInfo i, folderitems ) {
QString iname( i.fileName() );
if ( iname == "." || iname == ".." || iname.isEmpty() )
continue;

if ( i.isDir() )
totalsize += listFolder( path+"/"+iname );
else
totalsize += i.size();
}
return totalsize;
}


Название: Re: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: izoomer от Октября 05, 2007, 15:16
Попробуй это, должно работать
Код:
quint32 listFolder ( QString path ) {
QDir currentFolder( path );

quint32 totalsize = 0;                     

currentFolder.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );
currentFolder.setSorting( QDir::Name );

QFileInfoList folderitems( currentFolder.entryInfoList() );

foreach ( QFileInfo i, folderitems ) {
QString iname( i.fileName() );
if ( iname == "." || iname == ".." || iname.isEmpty() )
continue;

if ( i.isDir() )
totalsize += listFolder( path+"/"+iname );
else
totalsize += i.size();
}
return totalsize;
}
работает, хотя в чем отличие от моего кода так и не понял.
Спасибо.


Название: Re: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: orefkov от Октября 08, 2007, 15:54
Непонятны эти куски:
d.cd( path )
и
sizeDir( path + "/" + cat );
что за path?
В локальных переменных нету...
Может надо dirName?


Название: Re: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: Dodge от Октября 08, 2007, 16:02
работает, хотя в чем отличие от моего кода так и не понял.
Спасибо.
Надо быть внимательнее )
Обрати внимание на название переменных... и зачем тебе d.cd()? ... без него никак?


Название: Re: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: Dendy от Октября 08, 2007, 16:17
Наш велосипед самый велосипедистый велосипед в мире и никто неперевелосипедит наш велосипед (-:

1. Смотреть назначение флага: QDir::NoDotAndDotDot

2. Ненужная рекурсия. Того же можно было достигнуть путём:

Код:
QFileInfoList dirs;
dirs << QFileInfo( path );
while ( !dirs.isEmpty() )
{

  QFileInfo dirInfo = dirs.takeFirst();
  for ( QListIterator<QFileInfo> it( QDir( dirInfo.path() ).entryInfoList( flags ) ); it.hasNext(); )
  {
    const QFileInfo & newDirInfo = it.next();
    // handle it
    dirs << newDirInfo;
  }
}

3. Заюзать QDirIterator


Название: Re: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках
Отправлено: Dodge от Октября 08, 2007, 16:31
1. Смотреть назначение флага: QDir::NoDotAndDotDot
это запишу ... не знал.

2. Ненужная рекурсия. Того же можно было достигнуть путём:
3. Заюзать QDirIterator
а вот с этим в корне не согласен, все зависит от конкретной задачи.

З.Ы.
ИМХО если не пытатццо изобрести новый велосипед, то можно никогда не изобрести автомобиль... обычно изобретением велосипедов преобретаетцца очень ценный опыт.

З.Ы.Ы.
предираццо к коду написанному на форуме нехорошо  :P