需要异步文件阅读器而不知道大小

时间:2011-02-01 13:39:29

标签: c# .net asynchronous filestream

我需要一个方法,将文件异步读取到一个字节数组,但我不知道该文件的大小(它可以是几Kb的几个Mb)。

我已经尝试使用FileStream来获取长度并使用BeginRead,但问题是length是一个很长的并且BeginRead只接受int,如果文件很大,它可能会溢出。 我想的另一种方式是用较小的块读取它,但每次我必须读取一个新的字节块时,我将不得不创建一个新的数组(只是想避免必须初始化新的和更大的数组)。

如果有人知道更好的方式或更简单,我会感到高兴和感激:P另外,我会用较小的块阅读。 Ty提供任何帮助。

4 个答案:

答案 0 :(得分:2)

您可以将其分块为MemoryStream(MemoryStream将管理在内存中附加二进制信息),最后您可以调用memoryStream。ToArray()

此外,这是一种在两个流实例之间复制的方法(从文件流到MemorySream:

How do I copy the contents of one stream to another?

答案 1 :(得分:0)

您可以在数组中指定offset,这样您就可以分配一个大数组。

public IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, Object state)

stream.BeginRead(buffer, totalRead, chunkSize, ...);

然后在EndRead上,将读取大小添加到totalRead

答案 2 :(得分:0)

自从.NET doesn't support大于2Gb的对象以来,无论如何都必须按块读取它。

答案 3 :(得分:0)

另一种方法是启动一个线程并调用System.IO.File.ReadAllBytes(string)。这听起来并不像分块有什么好处(因为你要将整个内容带入内存)所以这将非常简单。

在此sample的帮助下:

    private void GetTheFile()
    {
        FileFetcher fileFetcher = new FileFetcher(Fetch);

        fileFetcher.BeginInvoke(@"c:\test.yap", new AsyncCallback(AfterFetch), null);
    }

    private void AfterFetch(IAsyncResult result)
    {
        AsyncResult async = (AsyncResult) result;

        FileFetcher fetcher = (FileFetcher)async.AsyncDelegate;

        byte[] file = fetcher.EndInvoke(result);

        //Do whatever you want with the file
        MessageBox.Show(file.Length.ToString());
    }

    public byte[] Fetch(string filename)
    {
        return File.ReadAllBytes(filename);
    }