读取大型可执行文件c#

时间:2011-08-08 17:28:56

标签: c# visual-studio

我的HD上有一个大约1 GB的文件。我想把这个文件读成一个字节数组。问题是Visual Studio正在抛出'System.OutOfMemoryException'。有没有办法在字节数组中处理这么大的文件?我需要在字节数组上,因为我想将数据附加到文件的特定部分,然后将附加数据写回我的HD。

谢谢你, 埃文

4 个答案:

答案 0 :(得分:3)

您不应该立即将整个文件读入Byte数组。以块的形式阅读文件

InputStream is = new FileInputStream(some file);
// Create the byte array to hold the data
byte[] bytes = new byte[Somelength];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) 
{
    offset += numRead;

    //do whatever you want do do with byes
}

// Ensure all the bytes have been read in
if (offset < bytes.length) 
{
   throw new IOException("Could not completely read file "+file.getName());
}

答案 1 :(得分:1)

如果您需要将数据插入文件的中间,我建议您创建一个 new 文件。在从原始文件复制数据和插入新数据之间交替。一次不需要在内存中占用太多。

复制特定的“块”应该简单如下:

public static void CopyChunk(Stream input, Stream output, int size)
{
    byte[] buffer = new byte[16 * 1024];
    while (size > 0)
    {
        int bytesRead = input.Read(buffer, 0, Math.Min(size, bufer.Length));
        if (bytesRead == 0)
        {
            // Or just return if you want - it depends on how you want to handle
            // the situation.
            throw new IOException("Not enough input data");
        }
        output.Write(buffer, 0, bytesRead);
        size -= bytesRead;
    }
}

答案 2 :(得分:1)

如果运行.NET4,那么MemoryMappedFile类在这种情况下非常有用。

如果你运行64位CPU是有益的,否则你必须有一个数据的滑动视图(64位地址空间可以轻松容纳1GB)

答案 3 :(得分:0)

读取零件,检查零件,在需要时添加额外的字节,写入新文件。重复,直到处理完所有。