如何在不将整个文件加载到内存的情况下读取/流式传输文件?

如何在不将整个文件加载到内存中的情况下,逐个读取任意文件并逐个处理(意味着逐字节或其他一些可提供最佳读取性能的块大小)? 处理的一个示例是生成文件的MD5哈希,尽管答案可以应用于任何操作。

我想拥有或写这个,但如果我能获得现有代码也会很棒。

(C#)

这是一个如何在不将整个内容加载到内存中的情况下以1KB的块读取文件的示例:

 const int chunkSize = 1024; // read the file by chunks of 1KB using (var file = File.OpenRead("foo.dat")) { int bytesRead; var buffer = new byte[chunkSize]; while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0) { // TODO: Process bytesRead number of bytes from the buffer // not the entire buffer as the size of the buffer is 1KB // whereas the actual number of bytes that are read are // stored in the bytesRead integer. } } 

System.IO.FileStream不会将文件加载到内存中。
此流是可搜索的,MD5哈希算法也不必加载流(文件)介绍内存。

请将file_path替换为文件的路径。

 byte[] hash = null; using (var file = new FileStream(file_path, FileMode.Open)) { using (var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider()) { hash = md5.ComputeHash(stream); } } 

在这里,您的MD5哈希将存储在hash变量中。

  int fullfilesize = 0;// full size of file int DefaultReadValue = 10485760; //read 10 mb at a time int toRead = 10485760; int position =0; // int // byte[] ByteReadFirst = new byte[10485760]; private void Button_Click(object sender, RoutedEventArgs e) { using (var fs = new FileStream(@"filepath", FileMode.Open, FileAccess.Read)) { using (MemoryStream requestStream = new MemoryStream()) { fs.Position = position; if (fs.Position >= fullfilesize) { MessageBox.Show(" all done"); return; } System.Diagnostics.Debug.WriteLine("file position" + fs.Position); if (fullfilesize-position < toRead) { toRead = fullfilesize - position; MessageBox.Show("last time"); } System.Diagnostics.Debug.WriteLine("toread" + toRead); int bytesRead; byte[] buffer = new byte[toRead]; int offset = 0; position += toRead; while (toRead > 0 && (bytesRead = fs.Read(buffer, offset, toRead)) > 0) { toRead -= bytesRead; offset += bytesRead; } toRead = DefaultReadValue; } } } 

复制Darin,此方法将读取10mb块直到文件末尾

 const int MAX_BUFFER = 1024; byte[] Buffer = new byte[MAX_BUFFER]; int BytesRead; using (System.IO.FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) while ((BytesRead = fileStream.Read(Buffer, 0, MAX_BUFFER)) != 0) { // Process this chunk starting from offset 0 // and continuing for bytesRead bytes! } 
 const long numberOfBytesToReadPerChunk = 1000;//1KB using (BinaryReader fileData = new BinaryReader(File.OpenRead(aFullFilePath)) while (fileData.BaseStream.Position - fileData.BaseStream.Length > 0) DoSomethingWithAChunkOfBytes(fileData.ReadBytes(numberOfBytesToReadPerChunk)); 

据我所知,这里使用的函数(特别是BinaryReader.ReadBytes ),不需要跟踪你读取的字节数。 您只需要知道while循环的长度和当前位置 – 流告诉您。