实际上,这比实践更重要。我对此感到非常沮丧,因为这对我来说是一个相当新的概念。我将在下面发布我的代码。
我正在尝试做什么:
将部件放回原处,然后将文件写入HD
byte [] sData = File.ReadAllBytes(@“C:\ Project1.exe”); // 16,384字节
// Split the data up here
int range = 8;
range *= 1024;
int pos = 0;
int remaining;
int i = 0;
byte[] test = null;
while ((remaining = sData.Length - pos) > 0)
{
byte[] block = new byte[Math.Min(remaining, range)];
test = new byte[block.Length + pos];
Array.Copy(sData, pos, test, pos, block.Length);
pos += block.Length;
i++;
}
File.WriteAllBytes(@"C:\blank.exe", test);
文件“blank.exe”总是损坏。
有人在这看到我的错误吗?
我很感激,Evan
答案 0 :(得分:1)
您正在通过循环每次传递重新创建测试数组。
这意味着当您将测试数组写入文件的末尾时,您只需编写您处理的最后一个数据块。
您有几个选择:
1)在每次传递时调整数组大小,并将先前的数据复制到新数组中。这将是非常低效的。这与Array.Resize使用的机制相同。
2)如果您提前知道所需的阵列大小(即它与您从文件中读取的数据大小相同或文件大小的倍数),那么只需在输入之前调整阵列大小一次循环。
3)使用不同的数据结构,例如List或ArrayList。
答案 1 :(得分:0)
就像competent_tech所说,你不想每次都重新创建测试数组。
我对此并不完全确定,但为什么不将byte[] test = null;
初始化为byte[] test = sData.Length;
并从循环中移除test = new byte[block.Length + pos];
?
答案 2 :(得分:0)
也许我错过了一些东西,但是你在前面的整个文件中都在啜饮,所以你已经没有输出缓冲区需要的大小了。这么多,你应该没问题:
private static void better_copy( ushort blockSize )
{
if ( blockSize < 1 ) throw new ArgumentOutOfRangeException("blockSize") ;
byte[] input = File.ReadAllBytes( @"C:\Project1.exe" ); // 16,384 bytes
byte[] output = new byte[ input.Length] ;
for ( int p = 0 , n = 0 ; p < input.Length ; p += n )
{
int octetsRemaining = input.Length - p ;
n = ( octetsRemaining < blockSize ? octetsRemaining : blockSize ) ;
Array.Copy( input , p , output , p , n ) ;
}
File.WriteAllBytes( @"C:\blank.exe" , output );
return ;
}