Диагностика сбоя QDir::rmdir
Я использую следующий код для удаления пустой папки в Linux:
bool removeFolder (const QString& path)
{
QDir dir(path);
assert(dir.exists());
return dir.rmdir(".");
}
По некоторым причинам он иногда возвращает false (для определенных папок, но эти папки, похоже, ни в коем случае не ошибаются). Если я впоследствии использую::rmdir из <unistd.h>
удалить ту же папку, это удается. Как я могу сказать, почему QDir::rmdir
терпит неудачу?
Такого никогда не было в Windows, QDir::rmdir
просто работает.
3 ответа
Подтверждаю: работает на windows, не работает на linux.
Читая документ «rmdir» в <unistd>, здесь https://pubs.opengroup.org/onlinepubs/007904875/functions/rmdir.html , там говорится, что « Если аргумент пути относится к пути, конечный компонент которого либо точка или точка-точка, rmdir() завершится ошибкой. " Так что, вероятно, происходит то, что QDir::rmdir() вызывает функцию unistd rmdir() в linux, а эта завершается ошибкой с ".".
Я попытался просто использовать полный абсолютный путь (QDir::rmdir(absolutePath)), и это сработало; тем не менее, я не вижу смысла в использовании QDir::rmdir() вместо rmdir() unistd, поэтому с этого момента я буду придерживаться unistd rmdir().
примечание: QDir::removeRecursively() — это совсем другая история: кажется, что это работает нормально, и это намного удобнее, чем переход через opendir(), а затем последовательные readdir() (или nftw(...FTW_DEPTH... ) штучка).
У меня была такая же проблема, но в Windows я не мог удалить пустой каталог с QDir().rmdir(path);
, Это произошло на более старом жестком диске, так что, возможно, виновата была древняя файловая система. Но я нашел взломать
QFile(path).setPermissions(QFile::WriteOther); // this works even for dirs
bool success = QDir().rmdir(path);
Конечно, вы должны вернуть разрешения обратно к исходным значениям, если удаление все равно не удалось, но это другая история.