我需要一个异步地将文件读取到字节数组的方法,但是我不知道文件的大小(可能是几KB,也可能是几Mb)。我尝试过FileStream来获取长度并使用BeginRead,但问题是length是一个long类型,而BeginRead只接受int类型,如果文件太大,可能会溢出。另一种方法是通过较小的块来读取,但每次我必须读取一个新的字节块时,我必须创建一个新的数组(只是想避免初始化新的更大的数组)。我愿意接受更好或更简单的方法,否则我会用更小的篇幅来阅读。
sdnqo3pr1#
您可以将其分块到MemoryStream中(MemoryStream将管理在内存中追加二进制信息),最后您可以调用memoryStream.ToArray()。此外,这里还有一种在两个流示例之间进行复制的方法(从文件流到MemorySream:How do I copy the contents of one stream to another?
wmvff8tz2#
无论如何,您必须按块读取它,因为.NET不支持大于2Gb的对象。
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); }
moiiocjp4#
您可以在数组中指定一个offset,它将允许您分配一个大数组。
offset
public IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, Object state) stream.BeginRead(buffer, totalRead, chunkSize, ...);
然后在EndRead上,将读取大小添加到totalRead
4条答案
按热度按时间sdnqo3pr1#
您可以将其分块到MemoryStream中(MemoryStream将管理在内存中追加二进制信息),最后您可以调用memoryStream.ToArray()。
此外,这里还有一种在两个流示例之间进行复制的方法(从文件流到MemorySream:
How do I copy the contents of one stream to another?
wmvff8tz2#
无论如何,您必须按块读取它,因为.NET不支持大于2Gb的对象。
mwngjboj3#
另一种方法是启动一个线程并调用System.IO.File.ReadAllBytes(string),听起来分块并没有什么好处(因为你要把整个东西放到内存中),所以这会很简单。
借助此sample的一些帮助:
moiiocjp4#
您可以在数组中指定一个
offset
,它将允许您分配一个大数组。然后在EndRead上,将读取大小添加到totalRead