Достаточно часто встречающаяся задача. Решать её будем с использованием потока (Stream).
В принципе, при реализации в лоб ничего сложного нет. Нам понадобятся 2 метода: getFile() и LenghtFile(), первый из которых возвращает поток с открытым файлом а второй - его длину. Длину нужно передавать потому что клиенту, получившему поток от службы, длинна открытого службой файла невидна.
Итак, интерфейсы:
Методы:
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();
Что там происходит: получаем длину файла в байтах, получаем поток с открытым файлом, копируем в байтовый массив из потока указанное число байт. Файл получен и висит в памяти. После этого открываем новый файловый поток с параметрами создания нового файла и записываем байтовый массив к себе на диск. Можно открыть полученный файл и убедиться что все в порядке.
В принципе, при реализации в лоб ничего сложного нет. Нам понадобятся 2 метода: getFile() и LenghtFile(), первый из которых возвращает поток с открытым файлом а второй - его длину. Длину нужно передавать потому что клиенту, получившему поток от службы, длинна открытого службой файла невидна.
Итак, интерфейсы:
public interface FileServiceInterface
{
[OperationContract]
Stream getFile();
[OperationContract]
int LenghtFile();
}
{
[OperationContract]
Stream getFile();
[OperationContract]
int LenghtFile();
}
Методы:
public Stream getFile()
{
{
string path = @"c:\test.txt";
FileStream file = File.Open(path, FileMode.Open);
FileStream file = File.Open(path, FileMode.Open);
return file;
}{
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();
Что там происходит: получаем длину файла в байтах, получаем поток с открытым файлом, копируем в байтовый массив из потока указанное число байт. Файл получен и висит в памяти. После этого открываем новый файловый поток с параметрами создания нового файла и записываем байтовый массив к себе на диск. Можно открыть полученный файл и убедиться что все в порядке.
Комментариев нет:
Отправить комментарий