今天开三贴了,问题还是搞不定

时间:2021-05-14 19:54:18
我现在用的是网上的FTPFactory.cs空上类上传一个压缩文件到一个Unix服务上,当我在从这个FTP上下载过来时老是提示错误,以我分析是因为格式问题,连路是没问题的,因为我上传一个.TXT的文件时下载过来就没问题.各位能否帮我分析一下。

顶者有分,在线等待。盼各位给予帮忙,感激不尽!

!   D:\AM_CDG20070323\test.rar: The file "???" header is corrupt
!   D:\AM_CDG20070323\test.rar: The file "???" header is corrupt
!   D:\AM_CDG20070323\test.rar: The file "???" header is corrupt
这个就是我在从FTP上复制到本地来解压时报的错误,刚刚忘记发错误信息上去了,还有就是我把这个文件直接复制上FTP,然后下载下来解压不会报错。





我在试了一下另处一个是WINDOWS的FTP服务器下载下来的就能正常解压。

真不知道这个要如何编码才能从Unix上下载下来后能正常解压.




在网上看了一下,是说要用二进制传送你们看看这个是转换成二进制吗
private void sendCommand(String command)
{
if ( this.verboseDebugging ) Debug.WriteLine(command,"FtpClient");

Byte[] cmdBytes = Encoding.ASCII.GetBytes( ( command + "\r\n" ).ToCharArray() );
clientSocket.Send( cmdBytes, cmdBytes.Length, 0);
this.readResponse();
}

至于用BAT我没找到资料.谁知道的指点一下,非常感激.

44 个解决方案

#1


不懂,學習下,幫頂

#2


应该不是这个命令格式的问题,因为txt文件都可以正常下载回来了,我记得ftp有一个命令,应该是binary,可以把传送的数据设为2进制模式,并不是说把命令使用2进制编码后发送。

#3


帮顶

#4


学习,顶下

#5


开三帖了?哪来那么多分?

#6


建议你找个标准的FTP服务器测试一下

#7


关注。

#8


ftp是有二进制传输方式的,是把传送的数据设为2进制模式,这个如果使用flaxfxp这样的工具的话也可以看出都会有这个选项的

#9


ftp
>open ***.**.***.**
>USER:****
>PASSED:*******
>binary (设置为2进制模式传输,否则会把<CR>翻译成<CR><LF>)
>get test.rar

#10


Unix 和 WINDOWS 的编码方式是相同的吗,他们一次性是否处理的数据位是相同长度?
其中涉及了压缩算法和解压算法的问题,要先确立个转换的思路哟 ^_^

#11


丿

#12


建议你找个标准的FTP服务器
是不是通信协议不对

#13


帮顶!

#14


比较诡异,
建议单步跟进去看一看,把每个包抓下来

#15


学习了

#16


linux/unix的FTP默认为文本传输
所有文本文件下载后的CR都会被增加换行符号变成CR+LF,这就导致文件被追加了内容无法打开
上传会把CR+LF缩写变成CR
所以一定要设置binary二进制传输方式

#17


支持一下

#18


楼主试着把test.rar文件改为test.txt看看效果?(下到本地在改回来解压看看)

#19


路过,顶一下

#20


up

#21


老板分多啊

#22


想不出会有什么原因.

#23


不懂,帮顶

#24


帮顶

#25


使用TCPClient.networkstream()是上传

#26


不知道帮顶,文件头不对?

#27


bat很简单:
  REM   创建需要的变量,你修改成你自己的就可以了,这样你就不需要修改下面的代码了   
  set   xdir=c:\
  set   ftpip=10.0.6.24
  set   user=movie
  set   pass=movie
  set   updir=abc    
  set   filname=20070209.wmv
  REM   检测服务器是否有生成需要的文件
 
  if   not   exist   %xdir%%filname%   goto   :EOF
     open   %ftpip%   >   tmp.txt
     User %user% %pass%>>   tmp.txt

     bin   >>   tmp.txt
     cd   %updir%   >>   tmp.txt
     lcd   %xdir%   >>   tmp.txt
     put   >>   tmp.txt
     %filnam%   >>   tmp.txt
     %filnam%   >>   tmp.txt
     bye   >>   tmp.txt
  ftp -n   -s:tmp.txt

#28


没搞过..

#29


帮顶了

#30


老大,我看了你的文件FTPFactory.cs,里面有一个方法,     
public void setBinaryMode(Boolean mode)
设一下就行了啊.

#31


下载文件前先确定它的传输连接模式:
"TYPE I";//binary类型传输
" TYPE A";//ASCII类型传输

#32


mark

#33


学习~~UP

#34


学习~~UP

#35


引用 18 楼 pfworld 的回复:
楼主试着把test.rar文件改为test.txt看看效果?(下到本地在改回来解压看看)


同意用这个方法测试下

#36


那我就帮顶了.

#37


学习下,再顶下

#38


不懂Unix

#39


绑定一下。

#40


可能是取得文件有问题!

stream1 = client1.GetStream();
            byte[] buffer1 = new byte[FTPConnection.BLOCK_SIZE];
            int num2 = 0;
            bool flag1 = true;
            while (flag1)
            {
                num2 = stream1.Read(buffer1, 0, buffer1.Length);
                pStream.Write(buffer1, 0, num2);
                if (num2 == 0)
                {
                    flag1 = false;
                }
            }
            pStream.Close();
            stream1.Close();
            client1.Close();

#41


你先确定上传的压缩文件和你本机的文件是否大小相同

clientSocket.Send(   cmdBytes,   cmdBytes.Length,   0);  这句我觉得与问题。send以后未必已经完全发送

#42


帮你顶顶

#43


    private void sendCommand(String command)
    {
        if (this.verboseDebugging) Debug.WriteLine(command, "FtpClient ");

        Byte[] cmdBytes = Encoding.Unicode.GetString((command + "\r\n ").ToCharArray());
        clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
        this.readResponse();
    } 

#44


引用 31 楼 King_fish 的回复:
下载文件前先确定它的传输连接模式: 
"TYPE   I ";//binary类型传输 
"   TYPE   A ";//ASCII类型传输

#1


不懂,學習下,幫頂

#2


应该不是这个命令格式的问题,因为txt文件都可以正常下载回来了,我记得ftp有一个命令,应该是binary,可以把传送的数据设为2进制模式,并不是说把命令使用2进制编码后发送。

#3


帮顶

#4


学习,顶下

#5


开三帖了?哪来那么多分?

#6


建议你找个标准的FTP服务器测试一下

#7


关注。

#8


ftp是有二进制传输方式的,是把传送的数据设为2进制模式,这个如果使用flaxfxp这样的工具的话也可以看出都会有这个选项的

#9


ftp
>open ***.**.***.**
>USER:****
>PASSED:*******
>binary (设置为2进制模式传输,否则会把<CR>翻译成<CR><LF>)
>get test.rar

#10


Unix 和 WINDOWS 的编码方式是相同的吗,他们一次性是否处理的数据位是相同长度?
其中涉及了压缩算法和解压算法的问题,要先确立个转换的思路哟 ^_^

#11


丿

#12


建议你找个标准的FTP服务器
是不是通信协议不对

#13


帮顶!

#14


比较诡异,
建议单步跟进去看一看,把每个包抓下来

#15


学习了

#16


linux/unix的FTP默认为文本传输
所有文本文件下载后的CR都会被增加换行符号变成CR+LF,这就导致文件被追加了内容无法打开
上传会把CR+LF缩写变成CR
所以一定要设置binary二进制传输方式

#17


支持一下

#18


楼主试着把test.rar文件改为test.txt看看效果?(下到本地在改回来解压看看)

#19


路过,顶一下

#20


up

#21


老板分多啊

#22


想不出会有什么原因.

#23


不懂,帮顶

#24


帮顶

#25


使用TCPClient.networkstream()是上传

#26


不知道帮顶,文件头不对?

#27


bat很简单:
  REM   创建需要的变量,你修改成你自己的就可以了,这样你就不需要修改下面的代码了   
  set   xdir=c:\
  set   ftpip=10.0.6.24
  set   user=movie
  set   pass=movie
  set   updir=abc    
  set   filname=20070209.wmv
  REM   检测服务器是否有生成需要的文件
 
  if   not   exist   %xdir%%filname%   goto   :EOF
     open   %ftpip%   >   tmp.txt
     User %user% %pass%>>   tmp.txt

     bin   >>   tmp.txt
     cd   %updir%   >>   tmp.txt
     lcd   %xdir%   >>   tmp.txt
     put   >>   tmp.txt
     %filnam%   >>   tmp.txt
     %filnam%   >>   tmp.txt
     bye   >>   tmp.txt
  ftp -n   -s:tmp.txt

#28


没搞过..

#29


帮顶了

#30


老大,我看了你的文件FTPFactory.cs,里面有一个方法,     
public void setBinaryMode(Boolean mode)
设一下就行了啊.

#31


下载文件前先确定它的传输连接模式:
"TYPE I";//binary类型传输
" TYPE A";//ASCII类型传输

#32


mark

#33


学习~~UP

#34


学习~~UP

#35


引用 18 楼 pfworld 的回复:
楼主试着把test.rar文件改为test.txt看看效果?(下到本地在改回来解压看看)


同意用这个方法测试下

#36


那我就帮顶了.

#37


学习下,再顶下

#38


不懂Unix

#39


绑定一下。

#40


可能是取得文件有问题!

stream1 = client1.GetStream();
            byte[] buffer1 = new byte[FTPConnection.BLOCK_SIZE];
            int num2 = 0;
            bool flag1 = true;
            while (flag1)
            {
                num2 = stream1.Read(buffer1, 0, buffer1.Length);
                pStream.Write(buffer1, 0, num2);
                if (num2 == 0)
                {
                    flag1 = false;
                }
            }
            pStream.Close();
            stream1.Close();
            client1.Close();

#41


你先确定上传的压缩文件和你本机的文件是否大小相同

clientSocket.Send(   cmdBytes,   cmdBytes.Length,   0);  这句我觉得与问题。send以后未必已经完全发送

#42


帮你顶顶

#43


    private void sendCommand(String command)
    {
        if (this.verboseDebugging) Debug.WriteLine(command, "FtpClient ");

        Byte[] cmdBytes = Encoding.Unicode.GetString((command + "\r\n ").ToCharArray());
        clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
        this.readResponse();
    } 

#44


引用 31 楼 King_fish 的回复:
下载文件前先确定它的传输连接模式: 
"TYPE   I ";//binary类型传输 
"   TYPE   A ";//ASCII类型传输