我需要检查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
无论如何,它总是让我失意。
我做错了什么,这是正确的做法吗?
答案 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 *)信号,因为只有在网络回复处理完毕后才会发出信号。也就是说,只有在文件存在的情况下完全下载文件后才会发出信号。
然后,
答案 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'。特纳的解决方案将起作用,我现在应该是一个可接受的替代方案。