我想取远程文件的最后修改日期,重复的调用后就取不到了,但其它的取文件长度等信息还能取到。
对于"HTTP_QUERY_LAST_MODIFIED"的参数有什么特殊的限制吗?
我想这不是很难的问题,但我调了2天了还是没搞清原因。

解决方案 »

  1.   

    每次查询以后,要把dwquerybuflen设置成一个较大的值就可以。
      

  2.   

    TO:kingzai:
    我看以前的贴了,说过把dwquerybuflen设置成一个较大的值就可以,但我还是有几处不明白。
    较大是多大?是不是大于sizeof(SYSTEMTIME)的值吗?直接采用MFC是不用该参数的。是不是不能用MFC的这个现成的函数。
      

  3.   

    TO KINGZAI:
    TKS。
    我先不用MFC试试,我猜是MFC处理上有问题。
    “重新清缓冲区”? 我每次调用都是要初始化“stUTC”的。
      

  4.   

    用GetLastError()得到的是12150,查不到对应的错误信息。
    还有就是我感觉好象不太稳定,有时可取到正确的值,有时不行。
    我是这样测试的:连续2次循环取2个文件的最后修改日期,第一次循环时,第1个文件文件2次循环都可正确的取到,第2个文件第1次循环可到正确的值但第2次循环就取不到正确的值了。但我下午再测试时又变了:第1个文件2次循环都可取到正确的值,但第2个文件第1次循环取不到正确的值了(但第2次循环又可取到正确的值了)谁知道到底是什么原因呀?我在线等。
      

  5.   

    你为什么要循环取呢?MSDN上我还没有找到多次调用会出错的KB,找到一篇它的用法,你可以看看。
    http://www.funducode.com/weeklyupdate/March_31/March_31.htm
    Article: Using HTTP
      

  6.   

    首先多谢你的耐心。
        是这样的,我想做一个自动更新程序,所以需要从网上循环取文件并比较最后修改时间,来确定需更新文件。在调试过程中我发现有些文件可以取到正确的最后修改时间,但有些却不能。
        你给我的那篇文章我看过了, 它的情况是只处理一个文件,和我的稍有不同。而且它没有取“最后修改时间”出错的预防和更正,呵,它在取不到时间后只是返回了“xx:x:xx”。
        刚开始我也怀疑是缓冲区没清空的问题,但QueryInfo取时间值时是不用处理缓冲区的。
        至于上面我做的循环,只是做测试的,我是想要测试一下QueryInfo取SYSTEMTIME的过程中出错的规律。
        再次表示感谢,这个问题已困扰我几天了。
      

  7.   

    自动升级一般不会读WEB文件的最后修改时间,这样不太准确。你写个ini或文本文件,把最后修改时间写在其中,读取内容之后做比较,这样会比较准确一些。
      

  8.   

    TO KINGZAI:
        TKS, 你说的正确,自动升级按我这样做是不太准确的,但一般能接受。
        如果写的ini文件中有修改时间则需要每次更新服务器端都要处理一次这个ini文件(如写入文件的修改时间), 会比较烦。而我这样做则这个ini文件只需要在建立时处理一次就可以了。
        我做测试时发现每次重启PC后,第一次总能取到值,但第二次就取不到了,我怀疑虽然QueryInfo(或HttpQueryInfo)取值时没申请但内部还是有缓冲区的设置,取完后没清空。
        我测试时用的是VS.NET 2003(没打补丁) + WIN2K 2004 SP4.
      

  9.   

    WEB SERVER是WIN2K 自带的IIS
      

  10.   

    执行QueryInfo后用GetLastError()得到的错误码是12150,12150在winerror.h中是没定义的。
      

  11.   


       12150       ERROR_HTTP_HEADER_NOT_FOUND
                   The requested header could not be located.
    我查到的错误是这个,你找个http sniffer对比一下两次的请求包是否一样,对这种怪问题,也只有如此来找问题了。
      

  12.   

    12150 未找到申请的邮件标头,vc自带的error lookup可以查错误信息。不知道你怎么做的,我通常不用MFC的类,而用wininet api。对于不同的远程文件,应该有不同的request对应吧,针对不同的request handle调用queryinfo应该没有问题。
      

  13.   

    多谢两位!
        TO: Hendy_So
        我的error lookup查不到12150的错误信息。    这个问题我找到出错地方并已解决了。出错的代码不是在QueryInfo这个函数,而是在HTTP请求句柄处:
    CHttpFile *pFile =pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,buf, 
    NULL, 1, NULL, NULL,HSR_DOWNLOAD| INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT);
    上面的代码在取第2个文件的最后修改时间时会出错。正确的代码:
    CHttpFile *pFile =pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,buf, 
    NULL, 1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_RELOAD);问题就出在传入这个dwFlags上,如单独用"INTERNET_FLAG_EXISTING_CONNECT"也是会出错。
    我想出现这个问题还是循环打开文件时, cache没清空的问题,用"INTERNET_FLAG_RELOAD"将不从cache中取值。    看来我需要好好理解一下dwFlags的各个值的真正含义。    光这个问题花了我3~4天,现在也到早晨了。我想这个贴了再留一天,也许还有其它人碰到过相同的问题或有更好的解释,明天结贴。
      

  14.   

    在error lookup里的modules里面添加wininet.dll就可以查到winet库里的出错消息了。
      

  15.   

    TO HENDY_SO:
      TKS. 可以查找到错误信息了。