Russian Qt Forum
Сентябрь 25, 2024, 02:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [qt-4.2.0 Linux] И снова о рекурсивном переборе файлов в папках  (Прочитано 6661 раз)
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;
}

Записан
Dodge
Гость
« Ответ #1 : Октябрь 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;
}
Записан
izoomer
Гость
« Ответ #2 : Октябрь 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;
}
работает, хотя в чем отличие от моего кода так и не понял.
Спасибо.
Записан
orefkov
Гость
« Ответ #3 : Октябрь 08, 2007, 15:54 »

Непонятны эти куски:
d.cd( path )
и
sizeDir( path + "/" + cat );
что за path?
В локальных переменных нету...
Может надо dirName?
Записан
Dodge
Гость
« Ответ #4 : Октябрь 08, 2007, 16:02 »

работает, хотя в чем отличие от моего кода так и не понял.
Спасибо.
Надо быть внимательнее )
Обрати внимание на название переменных... и зачем тебе d.cd()? ... без него никак?
Записан
Dendy
Гость
« Ответ #5 : Октябрь 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
Записан
Dodge
Гость
« Ответ #6 : Октябрь 08, 2007, 16:31 »

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

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

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

З.Ы.Ы.
предираццо к коду написанному на форуме нехорошо  Показает язык
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 20.