QProcess() 并不总是有效
QProcess() doesn't always work
我正在尝试使用 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()
信号连接到插槽并阻塞直到信号发出,但仍然没有成功。
文档对此不是很清楚,不过好像readAll has the same output as readAllStandardOutput. Software typically outputs errors on stderr (StandardError), so you would have to call readAllStandardError看到了错误信息。所以 QProcess()
没有错,只是 mkfs.fat
失败了。
我正在尝试使用 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()
信号连接到插槽并阻塞直到信号发出,但仍然没有成功。
文档对此不是很清楚,不过好像readAll has the same output as readAllStandardOutput. Software typically outputs errors on stderr (StandardError), so you would have to call readAllStandardError看到了错误信息。所以 QProcess()
没有错,只是 mkfs.fat
失败了。