Как читать и записывать файлы .img с помощью FileStream в С#?

Я пытаюсь прочитать файл изображения и записать его в новый файл. Но записанный файл изображения не является поддерживаемым файлом. расскажите, пожалуйста, как правильно читать/записывать файлы изображений. Помоги мне!!

Вот мой полный код. И я не получил никакой ошибки.

using System;
using System.IO;

namespace readfile
{
    class Program
    {
        static int totalbyte = 0;
        static void Main(string[] args)
        {
            string path = "C:/Users/Nitesh Rathi/Downloads/"; // file's path.
            string filename = "IMG_20200317_150302.jpg"; // file's name.
            string fullpath = path + filename;

            readfile(fullpath);
            writefile(filename);

            Console.ReadKey(false);
        }

        static void readfile(string path)
        {
            FileStream stm = File.Open(path, FileMode.Open); // open a file using filestream.
            int size = (int)stm.Length; // size of the file.
            byte[] data = new byte[stm.Length]; // file buffer.

            while (size > 0) // loop until file' size is not 0.
            {
                int read = stm.ReadByte(); // reading file's data.
                size -= read;
                totalbyte += read;
            }
        }
        static void writefile(string filename)
        {
            FileStream stm = File.Create(filename); // create a new file.
            byte[] data = new byte[totalbyte]; // file's data.

            Console.WriteLine("Writing data into file...");

            stm.Write(data, 0, data.Length); // writing data into created file.

            Console.WriteLine("data has been wrote into file.");
            stm.Close();
        }
    }
}

Я также использовал метод FileStream.Read(). Но это также не работает для меня.


person Community    schedule 21.03.2020    source источник
comment
Ваша цель просто скопировать существующий файл? Если это так, вы можете просто использовать File.Copy метод вместо того, чтобы создавать его самостоятельно.   -  person Markus Safar    schedule 21.03.2020
comment
Вы записываете все нули в файл, так как делаете только новый байт [общий байт]. Перед закрытием выполните stm.Flush();   -  person jdweng    schedule 21.03.2020
comment
@jdweng, не могли бы вы сказать мне, как это правильно сделать?   -  person    schedule 21.03.2020
comment
Попробуйте System.IO.File.Copy(fullpath, filename);   -  person Oguz Ozgul    schedule 21.03.2020
comment
Даже если это исправлено, ваш код очень неэффективно пытается скопировать файл, байт за байтом, а также загружая весь файл в память. Пожалуйста, не делайте этого. Ваше решение так же просто, как одна команда File.Copy.   -  person Oguz Ozgul    schedule 21.03.2020
comment
Сделайте данные byte[] статической переменной в верхней части кода, где находится totalbyte.   -  person jdweng    schedule 21.03.2020
comment
@Qguz Ozgul Я не могу использовать метод File.Copy(). Ну, я делаю приложение для передачи файлов, поэтому мне нужно прочитать содержимое файла и отправить его клиенту, чтобы клиент записал его в файл.   -  person    schedule 21.03.2020
comment
Ваш код не говорит об этом. Самый простой, но эффективный способ сделать это — открыть исходный файл для чтения с помощью: using(FileStream fs = File.Open(...) и предположить, что у вас есть выходной поток (NetworkStream? поскольку вы передаете этот файл удаленному клиенту), выполняющий: fs.CopyTo(destStream);. Вы также можете указать размер буфера, используемого при копировании: fs.CopyTo(destStream, 4096);   -  person Oguz Ozgul    schedule 22.03.2020


Ответы (1)


Я понял, в чем проблема в моем коде, и исправил свой код.

Смотрите мой фиксированный код. Посмотрите, какие изменения я сделал.

    Public static byte[] data; // this variable will be store file's content.

    static void readfile(string path)
    {
        FileStream stm = File.Open(path, FileMode.Open); // open a file using filestream.
        int size = (int)stm.Length; // size of the file.
        data = new byte[size];

        while (size > 0) // loop until file' size is not 0.
        {
            int read = stm.read(data, totalbyte, size); // reading file's data.
            size -= read;
            totalbyte += read;
        }
    }
    static void writefile(string filename)
    {
        FileStream stm = File.Create(filename); // create a new file.
        byte[] bytes = data;

        Console.WriteLine("Writing data into file...");

        stm.Write(data, 0, data.Length); // writing data into created file.

        Console.WriteLine("data has been wrote into file.");
        stm.Close();
    }
person Community    schedule 22.03.2020
comment
Этот код излишне сложен и может быть сокращен всего до двух строк: static void ReadFile(string path) { data = File.ReadAllBytes(path); } и static void WriteFile(string path) { File.WriteAllBytes(path, data); }. Таким образом, эти методы на самом деле вообще не нужны, поскольку они делают то же самое, что и встроенные функции. - person ckuri; 12.04.2020