.net 需要异步文件读取器而不知道大小

mo49yndu  于 2023-03-04  发布在  .NET
关注(0)|答案(4)|浏览(147)

我需要一个异步地将文件读取到字节数组的方法,但是我不知道文件的大小(可能是几KB,也可能是几Mb)。
我尝试过FileStream来获取长度并使用BeginRead,但问题是length是一个long类型,而BeginRead只接受int类型,如果文件太大,可能会溢出。另一种方法是通过较小的块来读取,但每次我必须读取一个新的字节块时,我必须创建一个新的数组(只是想避免初始化新的更大的数组)。
我愿意接受更好或更简单的方法,否则我会用更小的篇幅来阅读。

sdnqo3pr

sdnqo3pr1#

您可以将其分块到MemoryStream中(MemoryStream将管理在内存中追加二进制信息),最后您可以调用memoryStream.ToArray()
此外,这里还有一种在两个流示例之间进行复制的方法(从文件流到MemorySream:
How do I copy the contents of one stream to another?

wmvff8tz

wmvff8tz2#

无论如何,您必须按块读取它,因为.NET不支持大于2Gb的对象。

mwngjboj

mwngjboj3#

另一种方法是启动一个线程并调用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);
    }
moiiocjp

moiiocjp4#

您可以在数组中指定一个offset,它将允许您分配一个大数组。

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

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

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

相关问题