登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: indy ftp 不能上传大于 2g 文件的解决     [回主站]     [分站链接]
标题
indy ftp 不能上传大于 2g 文件的解决
clq
浏览(3) + 2009-05-29 15:47:01 发表 编辑

关键字:

indy ftp 不能上传大于 2g 文件的解决

unit IdGlobal;


function Min(AValueOne, AValueTwo: Integer): Integer;overload;//clq
function Min(AValueOne, AValueTwo : int64): int64;overload;//clq


//clq add
function Min(AValueOne, AValueTwo : int64): int64;
begin
If AValueOne > AValueTwo then
begin
Result := AValueTwo
end //If AValueOne > AValueTwo then
else
begin
Result := AValueOne;
end; //..If AValueOne > AValueTwo then
end;
//clq add _end;

--------------------------------------------------
//clq//procedure TIdTCPConnection.WriteStream(AStream: TStream; const AAll: boolean = true;
//clq const AWriteByteCount: Boolean = False; const ASize: Integer = 0);
procedure TIdTCPConnection.WriteStream(AStream: TStream; const AAll: boolean = true;
const AWriteByteCount: Boolean = False; const ASize: int64 = 0);
var
LBuffer: TMemoryStream;
//clq//LSize: Integer;
//clq//LStreamEnd: Integer;
LSize: int64;
LStreamEnd: int64;
begin
--------------------------------------------------
procedure TIdFTP.InternalPut(const ACommand: string; ASource: TStream);
var
LIP: string;
LPort: Integer;
//clq//LResponse: Integer;
LResponse: int64;//clq
begin

--------------------------------------------------
下载应该也有相同的问题,兄弟们自己改.总之就是 integer 换成 int64 .哪里有错改哪里.
不需要再安装更高版本的 indy. 只需要将 delphi7 下的相应文件复制到你的程序目录下修改就行了. 例如: C:\Program Files\Borland\Delphi7\Source\Indy

clq
2009-5-29 15:49:40 发表 编辑

附件[暂不开放下载]
上传一个文件,是我修改过的文件.编译时会说哪些文件版本不一样,把它们都复制过来就可以了.
ftp.zip


clq
2009-5-29 15:51:44 发表 编辑

delphi 得idftp.put方法能否上传大于2G得文件?
楼主chinawcs()2006-10-19 14:43:15 在 Delphi / VCL组件开发及应用 提问

当我上传大于2G得文件时put方法就报错:no data to trasfer 小于2G得没事
这是为什么呢?难到是bug?
大家给个解决办法呀 我得文件都是DVD盘制作得iso文件所以很大

另一个问题:
我搜索一个文件夹得全部文件 不包括下一级文件夹得文件
...
dim s as string
SearchResult: TSearchRec;
......
s:=Format('%.2f',[SearchResult.Size/(1024*1024)])

当文件比较大时 (大约2G左右)s返回'-XX' 而且数值xx和实际文件大小不同。
文件小得没有问题。
请大家帮忙

问题点数:50、回复次数:21Top
1 楼chinawcs()回复于 2006-10-19 15:01:54 得分 0

难道大家没有遇到过这样得问题Top
2 楼chinawcs()回复于 2006-10-19 15:20:39 得分 0

怎么这么冷清呀
Top
3 楼chinawcs()回复于 2006-10-19 16:28:25 得分 0

还没解决呢
我一上传大文件>2G得就报错:no data to read
为什么?Top
4 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2006-10-19 16:45:10 得分 0

可以的~
官方版本Indy 9.0.18

需要使用Int64
TSearchRec不支持的~
直接用Win32 API才OKTop
5 楼DelphiGuy()回复于 2006-10-19 17:01:57 得分 0

TSearchRec也可以,但是要用
TSearchRec.FindData.nFileSizeHigh和nFileSizeLow两个域来读文件大小。
Top
6 楼chinawcs()回复于 2006-10-19 17:51:39 得分 0

哦原来时bug 我下载 了indy 10.0.5
请大哥明示win32 api 获取文件大小属性方法

关于TSearchRec 我是这样解决得
var s:longword;

s:=SearchResult.Size

取s得值Top
7 楼DelphiGuy()回复于 2006-10-19 18:05:30 得分 0

var
s: int64;
// ...
s := int64(SearchResult.FindData.nFileSizeHigh) shl 32 + SearchResult.FindData.nFileSizeLow;
Top
8 楼chinawcs()回复于 2006-10-20 08:30:30 得分 0

谢谢

现在问题是我再idftp 得onwork , onworkbegin 里设置了gauge进度条显示上传进度
现在当我传大文件时 该过程
procedure TfrmMirrorSend.ftpClientWorkBegin(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: INTEGER);

AWorkCountMax: INTEGER是integer类型会溢出得。
如何解决这个问题呢?

我下载了upp_Indy_snapshot_2006-9-9.rar 不知能否解决这个问题。
Top
9 楼chinawcs()回复于 2006-10-20 09:01:44 得分 0

请大虾指点如何查看delphi 7安装自带得indy是哪个版本Top
10 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2006-10-20 12:53:08 得分 0

用最新的Indy 9.0.18
修改4个相关文件的Integer为Int64
即可支持>2GB的文件Top
11 楼chinawcs()回复于 2006-10-20 13:22:52 得分 0

我下载了indy10.1.5_d7.exe 和indy9.0.18_d7.exe

我装后着时显示for d6 ?
我得是delphi 7.0

装前者是不是更好,安装之前要卸载delphi 自带得indy 嘛?如何卸载呢

我装了后者后发现onwork事件 还是integer类型得。??



Top
12 楼DelphiGuy()回复于 2006-10-20 14:43:46 得分 0

Gauge只是一个比例问题,你自己缩放一下就可以了。
就是累计传送的字节 / 总量 * 100,再取整。(假设gauge的最大值设置为100)
在OnWork中,AWorkCount是指本次已传送的字节数,为什么还是integer呢?因为Win32上缓冲区最大也只能开到2GB(实际比这个还要小一点),当然不可能一次发送超过2GB的数据了,那需要多次发送。
Top
13 楼DelphiGuy()回复于 2006-10-20 14:45:03 得分 0

另外,如果你有使用Indy9的项目,最好不要切换到Indy10,变化很大(为了兼容.net的缘故)。
Top
14 楼chinawcs()回复于 2006-10-20 14:56:57 得分 0

楼上朋友:

是这样得我在idftp onworkbegin 事件中

procedure TfrmMirrorSend.ftpClientWorkBegin(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: INTEGER);
begin
ggProgress.maxvalue:=AWorkCountMax;
end;
当put发生时触发此事件 AWorkCountMax获得文件大小
但AWorkCountMax是integer类型,当传送>2G时就报错溢出了 因为他只能达到20亿。
如何处理呢?
Top
15 楼DelphiGuy()回复于 2006-10-20 16:12:56 得分 10

那你下一个indy9.0.19_d7,估计修正了。
Top
16 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2006-10-20 16:14:30 得分 30

都说了~
修改Indy 4个源文件
全部更改为Int64接口,包括函数的实现部分,(提示: ReadStream和WriteStream是关键)

修改后的Indy,支持>4GB的文件都是OK的

至于如何修改Indy,那就自己搞吧~Top
17 楼oushengfen(逸帆)回复于 2006-10-20 16:23:56 得分 5

这个倒没有遇到过,还没有上传下载那么大的文件.Top
18 楼chinawcs()回复于 2006-10-20 16:43:13 得分 0

听大哥得话

自己搞定了 该了3个pas int64就ok了
结贴了

谢谢兄弟们!Top
19 楼chinawcs()回复于 2006-10-20 17:34:43 得分 0

对 了如何卸栽 delphi 自带得indy组件包括 安装路径内容呢?
用delphi 安装盘可以嘛 ?Top
20 楼real_name(*真名)回复于 2006-10-20 19:31:17 得分 5

可以Top
21 楼chinawcs()回复于 2006-10-21 12:49:24 得分 0

已经安装编译过的组件

ok 了

就是占用内存太大了。


总数:2 页次:1/1 首页 尾页  
总数:2 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1