Повреждение при копировании изображения с помощью StreamReader - PullRequest
1 голос
/ 28 октября 2009

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

 private void ReadFile()
    {
        StreamReader MyReader = new StreamReader(@"C:\\Users\\admin\\Desktop\\apache_pb22_ani.gif");
        string ReadFile= MyReader.ReadToEnd();
        MyReader .Close ();

        StreamWriter MYWriter = new StreamWriter(@"C:\\Hi.gif");
        MYWriter.Write(ReadFile);
        MYWriter.Close();

        //throw new NotImplementedException();
    }

если я читаю изображение с сервера и если я пишу в файл изображения, также появляется та же проблема, в чем проблема ... код чтения изображения с сервера и записи здесь

StringBuilder sb = new StringBuilder();
        // used on each read operation
        byte[] buf = new byte[8192];
        // prepare the web page we will be asking for
        HttpWebRequest request = (HttpWebRequest)
                WebRequest.Create("http://10.10.21.178/Untitled.jpg");
        // execute the request
        HttpWebResponse response = (HttpWebResponse)
                request.GetResponse();
        // we will read data via the response stream
        Stream resStream = response.GetResponseStream();

        string tempString = null;
        int count = 0;

        StreamWriter FileWriter = new StreamWriter("C:\\Testing.jpg");


        do
        {
            // fill the buffer with data
            count = resStream.Read(buf, 0, buf.Length);
            // make sure we read some data
            if (count != 0)
            {
                // translate from bytes to ASCII text. 
                // Not needed if you'll get binary content.

                tempString = Encoding.ASCII.GetString(buf, 0, count);
                FileWriter.Write(tempString);
                // continue building the string
                sb.Append(tempString);
            }
        }
        while (count > 0); // any more data to read?

        FileWriter.Close();

        // print out page source
       // Console.WriteLine(sb.ToString());
        //throw new NotImplementedException();
    }

Ответы [ 4 ]

7 голосов
/ 28 октября 2009

Двоичные данные (например, изображения) не работают в строке .NET; Вы хотите что-то вроде (при условии, что File.Copy не вариант):

using(Stream source = File.OpenRead(fromPath))
using(Stream dest = File.Create(toPath)) {
    byte[] buffer = new byte[1024];
    int bytes;
    while((bytes = source.Read(buffer, 0, buffer.Length)) > 0) {
        dest.Write(buffer, 0, bytes);
    }
}

Это обрабатывает изображение как двоичное (byte[]) и использует буфер / цикл, чтобы избежать разрыва, если у вас большое изображение (когда File.ReadAllBytes может быть дорого).

2 голосов
/ 28 октября 2009

Вы не хотите использовать ReadToEnd (), то есть для текстовых файлов. Попробуйте File.ReadAllBytes (), он прочитает двоичный файл в байтовый массив. Затем вы можете записать этот файл обратно на диск с помощью File.WriteAllBytes ().

2 голосов
/ 28 октября 2009

Вы не можете прочитать GIF-файл (двоичный файл) в строковую переменную.

Вам нужно прочитать массив байтов.

0 голосов
/ 28 октября 2009

string использует UTF16. Я прав?

Это означает, что ваш код преобразует ASCII в UTF16. :)

Также вы не понимаете значение знака @. Поместите его перед строками, если хотите избегать двойной обратной косой черты. Ваш код @"C:\\Hi.gif" должен быть либо "C:\\Hi.gif", либо @"C:\Hi.gif".

...