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

时间:2018-09-20 17:57:12

标签: c# filestream binaryfiles

我正在尝试获取文件的前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();
    }

我在这里做什么错了?

2 个答案:

答案 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”打开,直到循环完成。