C# 将二进制文件的前X字节读入新文件

C# 将二进制文件的前X字节读入新文件,c#,filestream,binaryfiles,C#,Filestream,Binaryfiles,我正在尝试获取文件的前几个K,并将其存储到临时文件中,除了长度以外,不做任何更改。出于某种原因,这段代码似乎是从文件的中间而不是开始返回一些内容 public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read); public static FileStream shortFile = null; int limit = 10000; publ

我正在尝试获取文件的前几个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();
    }
我做错了什么?

文件。每次循环迭代时,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();
}

只是想进一步说明一下。。。您的
using(…)
语句将在代码离开块后关闭该文件,这将在每次循环迭代中覆盖该文件,除非您执行建议的操作,并使用(…)作为追加或删除
打开
阻塞并在需要时手动打开/关闭文件。
while
循环应该使用
块进入
内部,而不是相反。如果您只想写入第一个
限制
字节,那么就不应该使用while循环。谢谢,我在重复使用一些代码,在每个块上循环,但是文件太大了,所以我想缩短它们。我忘了取出while循环。
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();
}