Чтение и запись двоичного файла в С#

Я прочитал двоичный файл при использовании С# в соответствии со следующим кодом. Затем я попытался записать эти двоичные данные в другой двоичный файл. Но я обнаружил, что когда я открыл эти 2 файла в Winmerge, в обоих бинарных файлах есть разница. то есть чтение файла и запись файла. Не могли бы вы подсказать, почему есть разница, если я просто читаю файлы и переписываю?

       string fileNameWithPath_ = "1.pwpmi";
       string newfileNameWithPath_ = "2.pwpmi";

        System.IO.FileStream fileStream = new System.IO.FileStream(fileNameWithPath_, System.IO.FileMode.Open,
            System.IO.FileAccess.Read);
        System.IO.BinaryReader binReader = new System.IO.BinaryReader(fileStream, Encoding.ASCII);


        char[] chararr = new char[fileStream.Length];

        chararr = binReader.ReadChars((int)fileStream.Length);
        byte[] buffer = binReader.ReadBytes((int)fileStream.Length);

        byte[] bytes = new byte[fileStream.Length];
        fileStream.Read(bytes,0, (int)fileStream.Length);

        byte[] fileBytes = System.IO.File.ReadAllBytes(fileNameWithPath_);
        string stringbyte1 = Encoding.ASCII.GetString(fileBytes);

        binReader.Close();
        fileStream.Close();
        System.IO.BinaryWriter binWriter =
        new System.IO.BinaryWriter(System.IO.File.Open(newfileNameWithPath_, System.IO.FileMode.Create));
        binWriter.Flush();
        binWriter.Write(stringbyte1);
        binWriter.Close();

person Ganesh Chavan    schedule 18.05.2020    source источник
comment
Единственная часть этого кода, которую можно сохранить, это, пожалуй, System.IO.FileStream fileStream = new System.IO.FileStream(...). Можете ли вы описать, что вы на самом деле пытаетесь сделать? Вы просто хотите создать копию файла? Или изменить некоторые части первого, сохранив результат во втором? Что-то другое?   -  person Jimi    schedule 18.05.2020
comment
Почему вы делаете это сложнее, чем просто File.Copy(srcPath, dstPath) или в худшем случае (если вы действительно хотите перехватить или преобразовать скопированные данные): File.WriteAllBytes(dstPath, File.ReadAllBytes(srcPath))?   -  person Wyck    schedule 18.05.2020


Ответы (2)


Похоже, вы пробовали несколько разных методов и на самом деле подошли довольно близко к рабочему. Проблема, вероятно, заключается в том, как вы читаете свои двоичные данные как один тип данных и записываете их обратно в вывод как другой. Попробуйте придерживаться bytes:

    string fileNameWithPath_ = "1.pwpmi";
    string newfileNameWithPath_ = "2.pwpmi";

    System.IO.FileStream fileStream = new System.IO.FileStream(fileNameWithPath_, System.IO.FileMode.Open,
        System.IO.FileAccess.Read);
    System.IO.BinaryReader binReader = new System.IO.BinaryReader(fileStream, Encoding.ASCII);
    byte[] fileBytes = binReader.ReadBytes((int)fileStream.Length);
    //byte[] fileBytes = System.IO.File.ReadAllBytes(fileNameWithPath_); // this also works

    binReader.Close();
    fileStream.Close();
    System.IO.BinaryWriter binWriter =
    new System.IO.BinaryWriter(System.IO.File.Open(newfileNameWithPath_, System.IO.FileMode.Create));
    binWriter.Flush();
    binWriter.Write(fileBytes); // just feed it the contents verbatim
    binWriter.Close();

приведенный выше код не вносит никаких изменений во входящий поток байтов и создает идентичные файлы, когда я запускаю его через WinMerge

Как предполагают комментарии, вам может быть лучше просто скопировать файл:

    string fileNameWithPath_ = "1.pwpmi";
    string newfileNameWithPath_ = "2.pwpmi";
    File.Copy(fileNameWithPath_, newfileNameWithPath_, overwrite: true);
person timur    schedule 18.05.2020
comment
Я не хочу копировать файл. Я хочу записать двоичные данные в другой файл. Ваш код работает хорошо. спасибо - person Ganesh Chavan; 18.05.2020

Платформа .NET предоставляет встроенный метод для копирования файла:

File.Copy(fileNameWithPath_, newfileNameWithPath_)

(Здесь File равно System.IO.File.)

Или альтернативно:

using (FileStream inStream = new FileStream(fileNameWithPath_, FileMode.Open, FileAccess.Read))
using (FileStream outStream = new FileStream(newfileNameWithPath_, FileMode.Create, FileAccess.Write))
{
    inStream.CopyTo(outStream);
}
person drf    schedule 18.05.2020