понедельник, 12 марта 2012 г.

WCF сервис и обмен файлами.

Достаточно часто встречающаяся задача. Решать её будем с использованием потока (Stream).

    В принципе, при реализации в лоб ничего сложного нет. Нам понадобятся 2 метода: getFile() и LenghtFile(), первый из которых возвращает поток с открытым файлом а второй - его длину. Длину нужно передавать потому что клиенту, получившему поток от службы, длинна открытого службой файла невидна.
    Итак, интерфейсы:


    public interface FileServiceInterface
    {

        [OperationContract]
        Stream getFile();
        [OperationContract]
        int LenghtFile();


    }

Методы:



public Stream getFile()
        {
            string path = @"c:\test.txt";
            FileStream file = File.Open(path, FileMode.Open);
            return file;
        }


        public int LenghtFile()
        {
            int lenght = 0;
            string path = @"c:\test.txt";
            FileStream file = File.Open(path, FileMode.Open);
            lenght = (int)file.Length;
            file.Close();

            return lenght;
       
        }

Открывается один и тот-же жестко прописанный файл, возвращается его длинна и поток.
    Коряво, конечно. Поток нужно открывать отдельно, а не в методах, но для иллюстрации идеи сгодится.
    Собственно, для службы всё.

Перейдем к клиенту. Ему нужен целый один метод. Вот он:


            int lenght = FileService.LenghtFile();
            Stream file =FileService.getFile();
            byte[] bytes_file_w = new byte[lenght];
            file.Read(bytes_file_w, 0, lenght);

            string path = @"d:\test_wr.txt";
            FileStream file_w = File.Open(path, FileMode.Create);
            file_w.Write(bytes_file_w,  0, bytes_file_w.Length);
            file_w.Close();

    Что там происходит: получаем длину файла в байтах, получаем поток с открытым файлом, копируем в байтовый массив из потока указанное число байт. Файл получен и висит в памяти. После этого открываем новый файловый поток с параметрами создания нового файла и записываем байтовый массив к себе на диск. Можно открыть полученный файл и убедиться что все в порядке.

Похожие посты:

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

Отправить комментарий