Считывание всего файла в массив байтов в WINFORMS

#c# #stream

#c# #поток

Вопрос:

Я хочу прочитать содержимое файла, открытого с помощью диалогового окна file, а затем сохранить его в массиве байтов, чтобы передать его веб-службе

         Stream myStream;
        OpenFileDialog saveFileDialog1 = new OpenFileDialog();

        saveFileDialog1.Filter = "zip files (*.zip)|*.zip|All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 2;
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if ((myStream = saveFileDialog1.OpenFile()) != null)
            {

                NSITESERVICE.UploadSoapClient obj = new NSITESERVICE.UploadSoapClient();

                byte[] filebytes =  //what should i pass it over here...

                obj.UploadFile("kamal", "p@ssword", filebytes);

                // Code to write the stream goes here.
                myStream.Close();
            }
        }
 

Я не знаю, где я ошибаюсь

Любая помощь приветствуется. Thnaks

Комментарии:

1. Что я должен передать в byte[] filebytes.

Ответ №1:

Вы ничего не присваиваете filebytes переменной, поэтому вы, по сути, передаете службе значение null. Используйте File.Метод ReadAllBytes для чтения всех байтов и передачи их веб-сервису.

Комментарии:

1. Да, я передаю null. Это мой вопрос, что я должен передать. Пожалуйста, помогите

Ответ №2:

На самом деле вы не считываете байты из myStream.

 byte[] fileBytes = new byte[myStream.Length];
myStream.Read(fileBytes,0,mystream.Length);

obj.UploadFile(...)
 

Комментарии:

1. В настоящее время предполагается, что весь файл будет прочитан за один вызов. Это опасное предположение.

2. @KamalDeepSingh: Вы должны либо использовать File . Считайте все байты или повторно считывайте из потока и используйте возвращаемое значение из Read , чтобы узнать, сколько было фактически прочитано.

3. @JonSkeet Просто любопытно, в каком случае поток, возвращаемый OpenFileDialog, не будет выполнять полноформатное чтение?

4. @jlew: я не могу сказать наверняка, но в целом не следует предполагать, что потоки возвращают все свои данные за один раз. Единственное исключение из этого правила, которое я обычно допускаю, это MemoryStream . OpenFileDialog Позволяет ли вам извлекать файлы с (скажем) FTP-сервера, отображенного в Explorer? Если да, то это был бы разумный пример того, что он вполне может не вернуть все данные за один раз. Лучше не полагаться на это в любом случае, IMO.