FileStream返回Length = 0

时间:2015-05-12 08:12:11

标签: c# asp.net filestream

我试图读取本地文件并将其上传到ftp服务器上。当我读取图像文件时,一切正常,但是当我读取doc或docx文件时,FileStream返回length = 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;
    }
}

我无法找到它的错误。你能帮帮我吗?

2 个答案:

答案 0 :(得分: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);

可能是说明目标最简洁的方法......

答案 1 :(得分:0)

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