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