有没有办法使用Qt获取进程的所有打开文件的列表?

时间:2012-09-18 10:27:37

标签: c++ qt

我们的应用程序是跨平台的,因此用Qt编写。目标平台是Windows和Mac。在我们的项目中,我们需要确定一个单独进程的所有打开文件的列表。现在,我们使用WinAPI和相应的Mac OsX API以平台相关的方式进行。只要我们需要维护两个不相关的程序版本,这种方法已经引起了许多问题。

如果它有任何帮助,我们需要为Traktor和Serato(Dj Intro和Scratch Live)等程序确定打开的音频文件列表。我们使用的Qt版本是4.8.0。

那么,问题是,是否有任何与平台无关的方法来获取已打开文件的列表?或者至少使用某些第三方库或工具来解决某种问题?

1 个答案:

答案 0 :(得分:1)

即使Qt也不是独立于平台的;)它只是在通用API下封装了平台细节(如WIN3​​2 API与X11 API)。在您的情况下我也会这样做:设计一个(基于Qt的)类,它在您的应用程序中提供您需要的API,然后使用您现有的(特定于平台的)代码来提供您需要的功能。在您的应用程序中,您只能使用基于Qt的API,而无需担心应用程序代码中的平台细节。此外,您可以针对API编写任意数量的单元测试,以确保其行为正确。

示例(不是100%完整代码!):

在您的标头文件中:

class QMySpecificAPI : public QObject {
    Q_OBJECT    // only required when you need signals/slots

public:
    QList<QString> getOpenFiles();
}

在你的cpp文件中:

#include "QMySpecificAPI.h"

#ifdef Q_WS_WIN
QList<QString> QMySpecificAPI::getOpenFiles() {
   // Use WIN32 API to retrieve the file list
}
#endif

#ifdef Q_WS_MAC
QList<QString> QMySpecificAPI::getOpenFiles() {
    // Use MACOSX API to retrieve the file list
}
#endif

特别是因为您说您的现有代码已经存在很多问题,我强烈建议您实施单元测试用例并让它们定期运行以自动检查您的代码,例如

...
QMySpecificAPI api;
QList<QString> fileList = api.getOpenFiles();
ASSERT(fileList.count() == 5);   // or whatever you expect
...