Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# File.ReadAllBytes占用大量RAM,有更好的方法吗?_C# - Fatal编程技术网

C# File.ReadAllBytes占用大量RAM,有更好的方法吗?

C# File.ReadAllBytes占用大量RAM,有更好的方法吗?,c#,C#,我正忙于使用加密库,我想用AES GCM加密大文件。目前,在从CryptoStream写入临时文件Chipher后,我使用此文件加密文件: 此函数工作正常,但根据文件大小,它需要大量RAM。有没有更好的办法?我尝试使用FileStream,但它开始与我的代码冲突。是否有一种方法可以使用更少的内存或不使用内存来保存Chiperbyte[]?似乎您正在尝试编写一个包含三条信息的复合文件—标记、IV和密码文本。假设在加密完成之前无法获取标记值,那么您将尝试在加密完成后合成数据 当您尝试将大型加密文件加

我正忙于使用加密库,我想用AES GCM加密大文件。目前,在从CryptoStream写入临时文件Chipher后,我使用此文件加密文件:


此函数工作正常,但根据文件大小,它需要大量RAM。有没有更好的办法?我尝试使用FileStream,但它开始与我的代码冲突。是否有一种方法可以使用更少的内存或不使用内存来保存Chiperbyte[]?

似乎您正在尝试编写一个包含三条信息的复合文件—标记、IV和密码文本。假设在加密完成之前无法获取标记值,那么您将尝试在加密完成后合成数据

当您尝试将大型加密文件加载到内存中时,就会出现问题。幸运的是,streams为此提供了一个很好的简单解决方案:

byte[] authTag = encryptor.GetTag();

using (var tempfile = File.OpenRead(BUFER_PATH))
using (var outstream = File.Create(END_PATH))
{
    // write tag
    outstream.Write(authTag, 0, authTag.Length);
    // write IV
    outstream.Write(aes.IV, 0, aes.IV.Length);
    // copy data from source file to output file
    tempfile.CopyTo(outstream);
}

另一方面,如果提前知道标签和IV的大小,也可以将数据直接写入输出文件。只需在文件的开头为标记值分配空间,然后返回并在事实发生后将其写入即可。这就省去了使用临时文件的麻烦。

有没有一种方法可以直接将加密流输出到输出文件中,而不是使用中间临时文件阶段?加密流就是为此制作的,某种类型的流就是您所需要的;这是如何“开始与我的代码冲突”的?@DourHighArch我试图获取多个参数,如长度,但似乎无法获取它们。或者我缺乏如何打开和写入缓冲区路径的代码的经验。可能有一种简单的方法可以通过稍微修改代码来编写tag和IV。
byte[] authTag = encryptor.GetTag();

using (var tempfile = File.OpenRead(BUFER_PATH))
using (var outstream = File.Create(END_PATH))
{
    // write tag
    outstream.Write(authTag, 0, authTag.Length);
    // write IV
    outstream.Write(aes.IV, 0, aes.IV.Length);
    // copy data from source file to output file
    tempfile.CopyTo(outstream);
}