【问题标题】:Download file from FTP in original format以原始格式从 FTP 下载文件
【发布时间】:2014-03-10 11:27:05
【问题描述】:

我正在使用org.apache.commons.net.ftp.FTPClient.retriveFile(String,OutputStream) 将文件从 FTP 下载到 Windows 机器。当我下载一个文本文件时,它的格式丢失了。当我在记事本中打开下载的文件时,它看起来不像原始文件。请在随附的屏幕截图中找到差异。请找到我的以下代码,请任何人告诉我相同的解决方案。

FileOutputStream fos = new FileOutputStream(tempPath+File.separator+files[i].getName());
this.ftpClient.retrieveFile(files[i].getName(), fos);
fos.close();

【问题讨论】:

  • 看起来它正在将文件下载为二进制文件,您希望将其作为文本下载,因此它将行尾转换为您平台的格式。在文档中搜索“传输模式文本”之类的内容。
  • 是的,原始文件是 ASCII 格式的,我们正在尝试以二进制格式下载。你能帮我下载 ASCII 格式的文件吗
  • 见Apache Commons FTP problems:boolean success = client.setFileType(FTP.ASCII_FILE_TYPE);。但似乎默认类型已经是 ASCII。

标签: ftp ftp-client


【解决方案1】:

文件没有被改变,像ftp这样的传输协议从不真正改变文件本身的内容。他们最多修改一些标题信息。

您观察到的最有可能是文件中包含的空白的不同可视化结果。例如,制表符可以使用不同数量的空格来可视化,从而导致不同的缩进。

这种情况也可能是线宽不同的结果:显然您的第一个屏幕截图只是显示了以特定长度包裹的线。缺少换行符也是不同系统对换行符进行编码的方式不同的典型结果。 MS-Windows 使用与其他系统不同的行编码(目的不兼容)。尝试使用具有智能换行处理的编辑器。或者您可以以明确的方式选择换行符。

所以这个问题不是 ftp 问题,它(很可能)与您在两台机器上使用的不同软件或设置有关。

【讨论】:

  • 感谢您的回复,我发现这里缺少一些换行符。
  • FTP 可以 change line endings。您还可以在输出中看到白色框,表示仅找到 \n,而 Windows 期望 \r\n 用于换行。
  • 实际上原始文件是 ASCII 格式,我们正在尝试以二进制格式下载它。我认为这是问题的原因。请告诉我如何下载 ASCII 格式的文件。
  • @CodeCaster 不!换行符没有丢失,也没有被改变。 FTP不做这种事! 如何 换行符的编码根本没有一个通用标准。 \n 是 unixoid 系统完全正确的换行符。
  • 是的,read the RFC: "根据 NVT 标准,在必要时应使用 (\r\n) 序列来表示一行的结尾文本”。将 CRLF (\r\n) 转换为客户端平台的行尾由客户端决定。如果源文件只包含 \n 换行符,并且它作为 binary 发送,则不会更改行尾。
【解决方案2】:

不知道出了什么问题,我从来没有将文件直接保存到磁盘,但看起来它只写了一行,而你的文字包装器又把它打断了。

您可以尝试逐行读取文件,然后将其写入光盘。您使用什么语言?我可以给你一个 C# 解决方案。

字符串[] 文本;

使用 (StreamReader sr = new StreamReader("LoadFile.txt"))

        {
            string line;
            while ((line = sr.ReadLine()) != null) 
            {
                text += line + "\n";
            }
        }

使用 (StreamWriter sw = new StreamWriter("WriteFile.txt"))

        {
            foreach (string line in text)
            {
                sw.WriteLine(line);

            }
        }

这至少可以确保要加载的文件中的每一行在您编写的文件中都有自己的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多