try
  idhttp.get('xxx', fmem);  //fmem是一个TFileStream对象
finally
  idhttp.free;
  fmem.free;
end;我只是简略的写个大概~该代码在执行下载的时候,若遇断网或是程序被关闭包括强行结束进程。finally里都会执行, 也就是说fmem会正确释放。
fmem所创建的文件大小则是下载的量, 也就是说假设正在下载一个100M的文件, 在下载到10M的时候我突然关闭程序, 那文件大小就是10M。。 第二次尝试下载相同文件时, fmem直接打开已下载的文件, 从断点处开始下载, 这样完成断点续传功能。现在该程序有另一个模块, 用到ODBC, 如图, 是从服务器更新数据到本地
执行过程:检查更新->下载相关文件与数据->将数据添加至本地数据库经测试发现, 若程序一旦使用ODBC, 下载那里就有点问题了。 如果是断网, 也就是程序不结束的情况下, 断点续传没问题。 也就是说会执行到finally, 若程序直接关闭, 则不会执行, fmem对象得不到正确释放。导致的结果是明明只下载了10M, 而生成的文件大小是100M, 未下载部分的都是以00填充的。 这样我第二次打开程序继续下载时, fMem.Position := fMem.Size;idhttp.Request.Range := IntToStr( fMem.Position ) + '-';这两句就不能正确完成断点续传的功能了。 我目前的解决办法是如果文件大小与服务器文件大小相同, 则对比文件MD5, 不同的话会删掉文件重新下载。我非常奇怪, ODBC模块怎么会影响到这里的try..finally..end;