将二进制文件的前 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();
}