Прочитать первые X байтов двоичного файла в новые файлы - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь получить первые несколько 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 голосов
/ 20 сентября 2018

Эта строка неверна:

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();
}
0 голосов
/ 20 сентября 2018

File.Create (имя файла) перезаписывает файл каждый раз, когда цикл повторяется.Вместо этого вам нужно добавить или оставить «tempfile.dat» открытым до тех пор, пока ваш цикл не будет завершен.

...