我需要一个方法,将文件异步读取到一个字节数组,但我不知道该文件的大小(它可以是几Kb的几个Mb)。
我已经尝试使用FileStream来获取长度并使用BeginRead,但问题是length是一个很长的并且BeginRead只接受int,如果文件很大,它可能会溢出。 我想的另一种方式是用较小的块读取它,但每次我必须读取一个新的字节块时,我将不得不创建一个新的数组(只是想避免必须初始化新的和更大的数组)。
如果有人知道更好的方式或更简单,我会感到高兴和感激:P另外,我会用较小的块阅读。 Ty提供任何帮助。
答案 0 :(得分:2)
您可以将其分块为MemoryStream(MemoryStream将管理在内存中附加二进制信息),最后您可以调用memoryStream。ToArray()。
此外,这是一种在两个流实例之间复制的方法(从文件流到MemorySream:
答案 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);
}