【发布时间】:2013-10-18 13:42:00
【问题描述】:
我刚刚使用一个名为“Sound Juicer”的程序将我所有的 CD 复制到了我的计算机上。它工作正常,它为每个艺术家创建一个文件夹,并为每个专辑创建另一个文件夹。当然,在这些文件夹中还有 mp3 文件。
问题是我想要曲目编号、艺术家和曲目标题作为我歌曲的名称。 Sound Juicer 所做的是在代表“Disk 1 Title”的文件前面添加 d1t。
我是一名程序员,所以我用这个问题来练习一下。这有效:
void MainWindow::rename( const QString & text )
{
static int _files = 0;
QDir dir( text );
QFileInfoList a = dir.entryInfoList( QDir::Files | QDir::Dirs );
for( int i = 2; i < a.size(); i++ )
{
static QDir tmp;
if( a.at( i ).isDir() )
rename( a.at( i ).absoluteFilePath() );
if( a.at( i ).fileName().startsWith( "d1t" ) || a.at( i ).fileName().startsWith( "d2t" ) )
{
QString newFile = a.at( i ).fileName().remove(0,3);
tmp = a.at( i ).dir();
if( !tmp.rename( a.at( i ).fileName(), newFile ) )
qDebug() << "Failed";
_files++;
}
}
}
它检查一个目录,选择第一个文件或目录并检查它是什么。如果它是一个目录,它会调用自己(递归)并重新开始,直到他找到一些文件或不再存在目录。如果找到一个文件,它会重命名它并将文件计数器加 1。
然而,它只重命名了前 2 或 3 个目录中的所有文件。之后,它引起了 SIGSEGV。有谁知道怎么回事?
我的目录示例:
1 个目录(“Sum 41”)-> 1 个子目录(“All Killer No Filler”)-> 文件“d1t01.Sum 41 - Introduction to Destruction.mp3”等...... 2 子目录(“Blah Blah”)-> 文件 ...
2 个目录(“Shinedown”)-> 1 个子目录(“疯狂之声”)-> 文件 d1t01。 Shinedown - Devour.mp3 等...
3 目录(“Guns N' Roses”)-> 子目录(“Blah Blah”)-> 文件 ... 子目录(“Blah”)-> 文件 ...
【问题讨论】:
-
在调试器中运行它,看看它在哪里崩溃。
-
@FrankOsterfeld 在这里崩溃: QFileInfoList a = dir.entryInfoList( QDir::Files | QDir::Dirs );我试着让列表的寿命更长,当它超出范围时它会被销毁,对吧?
-
尝试去除静电,看看会发生什么。
-
@fonZ 现在它会在一段时间后崩溃。我的 Guns n' Roses 文件仍然没有变化
-
检查堆栈溢出或无限递归(可能由符号链接引起)另外,使用 QDir::NoDotAndDotDot 和 i = 0 比 i = 2 更好; ...