我正在尝试使用mkfs.fat
和QProcess()从Qt格式化USB驱动器。问题是调用了QProcess()但有时它会在不完成格式化的情况下退出。如果我读exitCode()
则为1。
这是功能:
bool UsbDevice::formatFat(QByteArray name)
{
QProcess * formatter = new QProcess(this);
QString partition = baDevice + "1"; // baDevice is "/dev/sdb"
QString mkfs = "mkfs.fat";
QStringList args;
args << "-F32" << "-v" << "-I" << "-n " + name << partition;
formatter->start(mkfs, args);
formatter->waitForStarted();
formatter->waitForFinished(-1);
emit logLine(formatter->readAll());
if (formatter->exitCode() == 0)
{
emit logLine("mkfs.fat executed correctly.");
}
else
{
emit logLine(QString("Possible fail to format device (Error: %1).").arg(formatter->errorString()));
}
delete formatter;
return true;
}
如果被调用3到5次,该功能可以正常工作。我知道有比这更多的问题(例如,由于waitFor*
函数,这个函数阻塞了用户界面,并且其中一个可以永久阻塞而没有超时)但我不知道为什么这个过程有时候没有完成。
logLine
调用qDebug
,输出无效时如下:
mkfs.fat 3.0.27 (2014-11-12)
Possible fail to format device (Error: Unknown error).
当它工作时,输出:
mkfs.fat 3.0.27 (2014-11-12)
/dev/sdb1 has 64 heads and 32 sectors per track,
hidden sectors 0x0800;
logical sector size is 512,
using 0xf8 media descriptor, with 30279937 sectors;
drive number 0x80;
filesystem has 2 32-bit FATs and 16 sectors per cluster.
FAT size is 14771 sectors, and provides 1890647 clusters.
There are 32 reserved sectors.
Volume ID is c35005fb, volume label USB .
mkfs.fat executed correctly.
这让我认为论证是正确的。
我还尝试将finished()
信号连接到一个插槽并阻塞,直到发出信号,但仍然没有运气。
答案 0 :(得分:2)
文档对此并不十分清楚,但看起来readAll的输出与readAllStandardOutput的输出相同。软件通常在stderr(StandardError)上输出错误,因此您必须调用readAllStandardError才能看到错误消息。因此QProcess()
没有任何问题,只有mkfs.fat
才会失败。