我正在尝试获取文件的前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();
}
我在这里做什么错了?
答案 0 :(得分:1)
此行是错误的:
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();
}
答案 1 :(得分:0)
File.Create(filename)都会覆盖文件。您需要添加附加内容,或者保持“ tempfile.dat”打开,直到循环完成。