将二进制文件的前 X 个字节读入新文件
Read first X bytes of binary file into new files
我正在尝试获取文件的前几 K 并将其存储到一个临时文件中,除了长度之外没有任何更改。出于某种原因,此代码似乎从文件的中间而不是开头返回某些内容。
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
while (stream.Read(block, 0, limit) > 0)
{
using (FileStream fs = File.Create("tempfile.dat"))
{
fs.Write(block, 0, block.Length);
if (stream.Position > limit)
{
return;
}
}
if (stream.Position > limit)
{
return;
}
}
InitializeComponent();
}
我做错了什么?
File.Create(filename) 每次循环迭代时都会覆盖文件。您需要改为追加,或者保持 "tempfile.dat" 打开直到循环完成。
这一行是错误的:
using (FileStream fs = File.Create("tempfile.dat"))
它强制为每个块读取创建一个新文件。您需要移动到您第一次从流中开始阅读的位置上方。
此外,if(stream.Position > limit)
条件在第一次读取后仍将是 true
,因为位置应该 正好在 limit
值。
您可能想要更多这样的东西:
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
const int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
while (stream.Read(block, 0, limit) > 0 && stream.Position <= limit)
{
fs.Write(block, 0, block.Length);
}
}
InitializeComponent();
}
甚至这个:
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
const int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
int bytes = stream.Read(block, 0, limit);
if (bytes > 0)
{
fs.Write(block, 0, bytes);
}
}
InitializeComponent();
}
我正在尝试获取文件的前几 K 并将其存储到一个临时文件中,除了长度之外没有任何更改。出于某种原因,此代码似乎从文件的中间而不是开头返回某些内容。
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
while (stream.Read(block, 0, limit) > 0)
{
using (FileStream fs = File.Create("tempfile.dat"))
{
fs.Write(block, 0, block.Length);
if (stream.Position > limit)
{
return;
}
}
if (stream.Position > limit)
{
return;
}
}
InitializeComponent();
}
我做错了什么?
File.Create(filename) 每次循环迭代时都会覆盖文件。您需要改为追加,或者保持 "tempfile.dat" 打开直到循环完成。
这一行是错误的:
using (FileStream fs = File.Create("tempfile.dat"))
它强制为每个块读取创建一个新文件。您需要移动到您第一次从流中开始阅读的位置上方。
此外,if(stream.Position > limit)
条件在第一次读取后仍将是 true
,因为位置应该 正好在 limit
值。
您可能想要更多这样的东西:
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
const int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
while (stream.Read(block, 0, limit) > 0 && stream.Position <= limit)
{
fs.Write(block, 0, block.Length);
}
}
InitializeComponent();
}
甚至这个:
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
const int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
int bytes = stream.Read(block, 0, limit);
if (bytes > 0)
{
fs.Write(block, 0, bytes);
}
}
InitializeComponent();
}