2

我需要检查http服务器上是否存在if文件,我有完整路径,当我通过浏览器尝试时一切正常,但是当我尝试在代码中执行时:

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

无论如何,它总是让我返回错误..我做错了什么,这是正确的方法吗?

4

3 回答 3

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)));

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

然后,

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

该函数QFile::exists无法创建 HTTP 请求,这对于实现您想要做的事情是必要的。您链接到的论坛讨论有效,因为该人正在尝试访问网络驱动器;这自然是操作系统支持的。

要检查文件是否存在,您将不得不走很长的路 - 这是如何与 Web 服务器通信的说明:http: //developer.nokia.com/Community/Wiki/Creating_an_HTTP_network_request_in_Qt

于 2013-08-10T17:37:21.053 回答
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”。特纳的解决方案会奏效,我的现在应该是一个可以接受的替代方案。

于 2013-08-10T17:38:49.810 回答