【问题标题】:FileStream returns Length = 0FileStream 返回长度 = 0
【发布时间】:2015-05-12 08:12:11
【问题描述】:

我正在尝试读取本地文件并将其上传到 ftp 服务器。当我读取图像文件时,一切正常,但是当我读取 doc 或 docx 文件时,FileStream 返回长度 = 0。这是我的代码: 我检查了一些其他文件,它似乎只适用于图像,并且它为任何其他文件返回 0

if (!ftpClient.FileExists(fileName))
{
    try
    {
        ftpClient.ValidateCertificate += (control, e) => { e.Accept = true; };

        const int BUFFER_SIZE = 64 * 1024; // 64KB buffer
        byte[] buffer = new byte[BUFFER_SIZE];
        using (Stream readStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read))
        using (Stream writeStream = ftpClient.OpenWrite(fileName))
        {
            while (readStream.Position < readStream.Length)
            {
                buffer.Initialize();
                int bytesRead = readStream.Read(buffer, 0, BUFFER_SIZE);
                writeStream.Write(buffer, 0, bytesRead);
            }
            readStream.Flush();
            readStream.Close();
            writeStream.Flush();
            writeStream.Close();
            DeleteTempFile(tempFilePath);
            return true;
        }
    }
    catch (Exception ex)
    {
        return false;
    }
}

我找不到它有什么问题。你能帮帮我吗?

【问题讨论】:

  • 它只发生在 doc/docx 文件上吗?访问和图片文件有区别吗?
  • 你是说readStream.Length 是零?您是否使用调试器对其进行了测试,或者假设它基于在 ftp 服务器上获取零大小的文件?如果是后者,我建议您记录异常,因为可能会出错,以及当它出错时如何简单地返回 false。
  • 我检查了一些其他文件,它似乎只适用于图像,并且对于任何其他文件返回 0
  • 所以在一个完全干净的项目中,File.OpenRead(path).Length 在绝对大于零的.doc 文件上为零?你确定吗?您确定 tempFile 大于 0 字节吗?你一开始写对tempFile了吗?您是否关闭并刷新了创建 tempFileFileStream
  • 是的,文件肯定大于零。是的,我在保存 tempFile 后关闭并刷新

标签: c# asp.net filestream


【解决方案1】:

虽然这不能回答您的具体问题,但您实际上并不需要知道流的长度。继续阅读,直到你读到零长度。 A zero byte read is guaranteed to indicate the the end of any stream.

返回值

类型:System.Int32

读入缓冲区的总字节数。如果当前没有那么多字节可用,则该字节数可能小于请求的字节数;如果已到达流的末尾,则该字节数可能为零 (0)。

while (true)
{
    int bytesRead = readStream.Read(buffer, 0, BUFFER_SIZE);
    if(bytesRead==0)
    {
        break;
    }
    writeStream.Write(buffer, 0, bytesRead);
}

或者:

readStream.CopyTo(writeStream);

可能是陈述你目标的最简洁的方法......

【讨论】:

  • 我试过 readStream.CopyTo(writeStream);但它仍然会创建一个空文件
【解决方案2】:

这只是一个愚蠢的错误,我有两个文件上传,我已经保存了另一个文件上传,所以它创建了一个零长度文件。看起来代码工作正常。 谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多