这个问题有点类似断点续传。网站上有一个文本文件a.txt,它在一天内随着时间的变化,而文件内容不断被添加数据而变大了,最大会有1M左右。但是我只想快速获取它的最后20行数据(而不用这种笨方法:先下载整个文本文件,再读取最后20行),请问如何是好?诚心求解,万分感谢!

解决方案 »

  1.   

    在http协议中断点续传是根据Header中的Range域实现的,Range域中的数值是要下载文件的范围。如果你的文本文件在20行之前的数据大小是不定的,恐怕用http协议准确获得最后20行是不可能实现的。
    如果后20行的数据大小是确定的,可以取得文件的大小后计算Range的值。
    或者估计一下后20行的大小,用Range取出后部分文件。
      

  2.   

    a.txt每隔等1分钟加一次数据进去。
    后20行大小基本不变,变的话,也会在几个字符之内。
    有没有详细一点的代码,请指教。
      

  3.   

    关键是你能否确定从第多少字节开始下载,如果确定了这一点,用winsock发一个类似这样的文件头过去等着接收就行了:
    "GET /a.txt HTTP/1.1" 
    "Host: 12.34.56.78"  
    "Referer: http://12.34.56.78/remotedir"  '//下载文件的URL位置
    "Range: bytes=1234-"           '//文件的开始下载位置是1234
      

  4.   

    在网站上用ASP写个服务,用来读取txt并返回指定的文本。客户端调用这个asp。
      

  5.   

    Dim strCommand As String
    Dim strWebPage As String
    Dim FileSize As IntegerPrivate Sub Command1_Click()Winsock1.RemoteHost = "100.0.1.1" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
    Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
    Winsock1.Connect '返回与远程计算机的连接。
    End SubPrivate Sub Winsock1_Close()End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。
    On Error Resume Next
    strWebPage = "/a.txt"
    strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令
    strCommand = strCommand + "Accept: */*" + vbCrLf      '这句可以不要
    strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
    strCommand = strCommand + "Referer: http://100.0.1.1/" + vbCrLf '这句可以不要
    strCommand = strCommand + "RANGE: bytes=200070-" + vbCrLf '这句可以不要
    'strCommand = strCommand + "Range: bytes=303081-" + vbCrLf '这句可以不要
    strCommand = strCommand + vbCrLf      '记住一定要加上vbCrLfDebug.Print strCommandWinsock1.SendData strCommand  ''给远程计算机发送数据End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件
    On Error Resume Next   '在错误处理程序结束后,恢复原有的运行
    Dim webData As String
    Winsock1.GetData webData, vbString '检取当前的数据块    If InStr(1, webData, "Content-Length:") > 0 And FileSize = 0 Then   '仅第一次计算,FileSize=0
            Dim pos1 As Long, pos2 As Long
            pos1 = InStr(1, webData, "Content-Length:")
            pos2 = InStr(pos1 + 16, webData, vbCrLf)
            If pos2 > pos1 Then
                filesizebyte = Mid(webData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长
                MsgBox filesizebyte'成功取得文件长度
            End If
        End If
    上面的代码,我成功取得了文件长度,是不是先关掉winsock,再重新指定下载位置,再下载呀,还需要补充些什么代码。谢谢
      

  6.   

    up如下面的代码,无法断点取,而如果把str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"改成str1 = "GET / HTTP/1.0"则可以断点取,为何?'Option Explicit
    Dim strCommand As String
    Dim strWebPage As String
    Dim FileSize As IntegerPrivate Sub Command1_Click()Winsock1.RemoteHost = "www.relaxsoft.net" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
    Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
    Winsock1.Connect '返回与远程计算机的连接。
    End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生。
    On Error Resume Next
    'strWebPage = "/"
    'strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf 'GET 为FTP命令
    'strCommand = strCommand + "Accept: */*" + vbCrLf      '这句可以不要
    'strCommand = strCommand + "Accept: text/html" + vbCrLf '这句可以不要
    'strCommand = strCommand + "Referer: http://218.90.212.30/" + vbCrLf '这句可以不要
    'strCommand = strCommand + "RANGE: bytes=200070-" + vbCrLf '这句可以不要
    'strCommand = strCommand + "Range: bytes=303081-" + vbCrLf '这句可以不要
    'strCommand = strCommand + vbCrLf      '记住一定要加上vbCrLf'Debug.Print strCommand'Winsock1.SendData strCommand  ''给远程计算机发送数据    str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0" & vbCrLf & _
                "Host: www.relaxsoft.net" & vbCrLf & _
                "Accept: */*" & vbCrLf & _
                "User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)" & vbCrLf & _
                "Referer: http://www.relaxsoft.net/soonweb/new/read.asp?id=172" & vbCrLf & _
                "Range: bytes=366-" & vbCrLf & _
                "Pragma: no-cache" & vbCrLf & _
                "Cache-Control: no-cache" & vbCrLf & _
                "Connection: close" & vbCrLf & vbCrLf
    Winsock1.SendData str1
    Debug.Print str1End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '当新数据到达时产生该事件
    On Error Resume Next   '在错误处理程序结束后,恢复原有的运行
    Dim webData As String
    Winsock1.GetData webData, vbString '检取当前的数据块    If InStr(1, webData, "Content-Length:") > 0 And FileSize = 0 Then   '仅第一次计算,FileSize=0
            Dim pos1 As Long, pos2 As Long
            pos1 = InStr(1, webData, "Content-Length:")
            pos2 = InStr(pos1 + 16, webData, vbCrLf)
            If pos2 > pos1 Then
                filesizebyte = Mid(webData, pos1 + 16, pos2 - pos1 - 16) '计算文件的长
                MsgBox filesizebyte
                'Winsock1.Close
                
    'Winsock1.RemoteHost = "218.90.212.30" '返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,比如 "FTP://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,比如 "100.0.1.1"。
    'Winsock1.RemotePort = 80 '返回或设置要连接的远程端口号
    'Winsock1.Connect '返回与远程计算机的连接。
                'Winsock1.SendData "Range: bytes=303081-"
                
            End If
        End If
        Text1.Text = Text1.Text + webData
    End Sub
      

  7.   

    至于要提交怎样的请求信息,可以自己亲自体验一下,用到两个软件:sniffer pro和讯雷(或其他任何一款支持断点续传的下载软件),方法如下:用讯雷下载该服务器上的一个文件,下载到一定程度时暂停,启动sniffer pro开始拦截,用讯雷继续下载,sniffer pro结束拦截然后看看讯雷发出的请求信息就行了。
      

  8.   

    请问是不是没有固定的文件,象这种格式str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"就不能实现类似的断点取了?是不是可以当数据到来时,假装已接收,发什么消息过去,让它接着传数据过来,最后只接收真正想要的数据?如上面的代码,无法断点取,而如果把str1 = "GET /soonweb/new/read.asp?id=172 HTTP/1.0"改成str1 = "GET / HTTP/1.0"则可以把主页文件断点取来。难道没有好办法吗?