如何在阅读文件中获得更好的方法?

时间:2011-02-01 11:34:46

标签: c# .net

我这里只有一个函数,调用者想要字节数,然后返回字节,但如果文件中没有足够的字节,它应该返回一个更小的数组。有没有更好的方法来做到这一点?我的意思是没有获得2个数组并使用BlockCopy

byte[] GetPartialPackage(string filePath, long offset, int count)
{
    using (var reader = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        reader.Seek(offset, SeekOrigin.Begin);
        byte[] tempData = new byte[count];
        int num = reader.Read(tempData, 0, count);
        byte[] tempdata = new byte[num];
        Buffer.BlockCopy(tempData, 0, tempdata, 0, num);
        return tempdata;
    }
}

2 个答案:

答案 0 :(得分:3)

只需根据流的长度更新计数,以便在必要时缩短它。

byte[] GetPartialPackage(string filePath, long offset, int count)
{
    using (var reader = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        reader.Seek(offset, SeekOrigin.Begin);
        int avaliableCount = Math.Min(count, (int)(reader.Length - offset));
        byte[] tempData = new byte[avaliableCount];
        int num = reader.Read(tempData, 0, avaliableCount);
        return tempData;
    }
}

答案 1 :(得分:0)

这只会分配一个字节数组:

byte[] GetPartialPackage(string filePath, long offset, int count)
{
    using (var reader = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        reader.Seek(offset, SeekOrigin.Begin);
        int actualCount = Math.Min(count, reader.Length - offset);
        byte[] tempData = new byte[actualCount];
        reader.Read(tempData, 0, actualCount);        
        return tempdata;
    }
}

但请注意,根据http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx的MS文档,即使尚未到达流末尾,FileStream实际上也可能读取的字节数少于请求的字节数。