Qt 4.8.4如何检查http服务器上是否存在文件

时间:2013-08-10 17:29:56

标签: c++ qt

我需要检查http服务器上是否存在文件, 我有完整的路径,当我通过浏览器尝试它所有工作 但是当我尝试代码时:

if(QFile::exists("http://www.foo.com/hidden/Support/myapp_1.1.2_installer.exe" ))
    {
        qDebug("file exists");
        return true;
    }
    else
    {
        qDebug("file not exists");
    }
正如它在这里写的那样: http://www.qtcentre.org/archive/index.php/t-43712.html?s=b9ae49962c9219aec93b43c514e2ba33

无论如何,它总是让我失意。 我做错了什么,这是正确的做法吗?

3 个答案:

答案 0 :(得分:1)

函数QFile::exists无法创建HTTP请求,这是实现您要执行的操作所必需的。您链接的论坛讨论有效,因为该家伙正在尝试访问网络驱动器;这自然得到了操作系统的支持。

要检查文件是否存在,您将不得不走很远的路 - 以下是有关如何与网络服务器通信的说明:http://developer.nokia.com/Community/Wiki/Creating_an_HTTP_network_request_in_Qt

答案 1 :(得分:1)

Qt类QFile只能处理本地文件系统上的文件。

您可以尝试使用Qt Network模块,可能是这样的:

QNetworkAccessManager *nam = new QNetworkAccessManager(this);
....
QNetworkRequest req(QUrl("http://www.foo.com/hidden/Support/myapp_1.1.2_installer.exe"));
QNetworkReply *reply = nam->get(req);
connect(reply, SIGNAL(metaDataChanged()),
        this, SLOT(slotMetaDataChanged()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slotNetworkError(QNetworkReply::NetworkError)));

注意如果您只想检查文件是否存在,则不要连接到完成的(QNetworkReply *)信号,因为只有在网络回复处理完毕后才会发出信号。也就是说,只有在文件存在的情况下完全下载文件后才会发出信号。

然后,

    每当您收到新的HTTP响应头时,都会调用
  1. slotMetaDataChanged(),然后您可以检查QNetworkRequest :: HttpStatusCodeAttribute以获取响应HTTP代码,如200(OK)或404(Not Found)。在您的情况下,如果返回的HTTP代码是200,则该文件存在。
  2. 当网络请求遇到错误时调用slotNetworkError(),例如“找不到主机”或“拒绝连接”,由您来处理这个插槽中的这些情况。

答案 2 :(得分:0)

你试图这样做的方式是完全错误的。 QFile无法查询网络服务器。您需要做的是使用QNetworkAccessManager类。有了这个,您可以尝试下载myapp_1.1.2_installer.exe。如果该文件不存在,您将收到一条错误消息。

为什么qtcente.org上的海报声称它对他有用......不知道。 也许因为他的地址是本地的。但它仍然有点可疑。

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(replyFinished(QNetworkReply*)));

manager->head(QNetworkRequest(QUrl("www.foo.com/hidden/Support/myapp_1.1.2_installer.exe")));

replyFinished插槽中的QNetworkReply具有方法NetworkError QNetworkReply::error() const。 如果您的文件不存在,您应该获得QNetworkReply :: ContentNotFoundError。

编辑:正如几条评论指出的那样,只是为了了解远程服务器上存在的文件,使用'get'并连接到replyFinished可能不是最好的想法。对于非常小的文件可能没问题,但对于大量数据来说肯定有点过分。我将'get'请求改为'head'。特纳的解决方案将起作用,我现在应该是一个可接受的替代方案。