Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли в оперативной памяти найти экземпляр класса MemoryStream? / 12 сообщений из 12, страница 1 из 1
05.11.2013, 12:49
    #38452841
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
Привет всем.
У меня есть статический класс Class, в котором я вызываю метод Write и записываю определенные данные в файл.
Бывает (редко), что доступа к файлу в данный момент нет и я записываю данные в MemoryStream:
Код: c#
1.
2.
byte[] byteArray = Encoding.ASCII.GetBytes(string);
            MemoryStream stream = new MemoryStream(byteArray);



Вопрос: каким образом я могу достать данные из этого stream при следующем вызове статического метода Class.Write

Код: c#
1.
StreamReader reader = new StreamReader(stream);


если у меня уже нет этого экземпляра stream класса StreamReader (но данные всё ещё хранятся в оперативной памяти?)
...
Рейтинг: 0 / 0
05.11.2013, 12:50
    #38452846
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
* всмысле нет экземпляра stream класса MemoryStream
...
Рейтинг: 0 / 0
05.11.2013, 12:55
    #38452858
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
а ты сохрани ссылку по этому случаю
...
Рейтинг: 0 / 0
05.11.2013, 13:00
    #38452872
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
...
Рейтинг: 0 / 0
05.11.2013, 13:04
    #38452877
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
Pallarisа ты сохрани ссылку по этому случаю

вы имеете ввиду вообще делать без MemoryStream, а создавать ещё 1 файл и запоминать на него ссылку?
...
Рейтинг: 0 / 0
05.11.2013, 13:21
    #38452903
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
Studentsвы имеете ввиду вообще делать без MemoryStream, а создавать ещё 1 файл и запоминать на него ссылку?
Pallaris посоветовал тебе сохранять значение переменной stream в поле класса. Так как у тебя статический метод, то и поле должно быть статическим.

На самом деле в твоем коде вообще не нужен MemoryStream. Для сохранения данных из byteArray достаточно сохранить сам массив. Не забывай что данные могут потеряться в случае потери питания поэтому возможно лучше сохранять их во временный локальный файл.

P.S.
Students
Код: c#
1.
byte[] byteArray = Encoding.ASCII.GetBytes(string);


Ты точно уверен что тебе нужна ASCII кодировка? В ней есть только латинские символы, цифры и знаки препинания. Если в твоих данных нет кирилицы или других не-ASCII символов, то тогда нет проблем.
...
Рейтинг: 0 / 0
05.11.2013, 13:49
    #38452967
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
да, у меня в статическом классе включен FileSystemWatcher, который отслеживает изменения файлов. эти изменения я записываю в файл. проблема как раз в том, что файл иногда может быть недоступен.

через поле не работает:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
class Program
    {
        static void Main(string[] args)
        {
            ClassHelper.Write(DateTime.Now.ToString());
            string text = ClassHelper.Read();
            Console.WriteLine(text);
            Console.ReadLine();
           
            text = ClassHelper.Read();
            Console.WriteLine(text);
            Console.ReadLine();
        }
    }

public static class ClassHelper
    {
        public static MemoryStream stream;

        public static MemoryStream ms
        {
            get
            {
                return stream;
            }
            set
            {
                stream = value;
            }
        }

        public static void Write(string str)
        {
            byte[] byteArray = Encoding.ASCII.GetBytes(str);
            stream = new MemoryStream(byteArray);
        }

        public static string Read()
        {
            string text = "";

            StreamReader reader = new StreamReader(stream);
            text += reader.ReadToEnd() + Environment.NewLine;

            return text;
        }
    }



второй раз в консоли выводит пустое значение, хотя должен вывести ту же дату, как и в первый раз
...
Рейтинг: 0 / 0
05.11.2013, 14:04
    #38452993
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
если в классе Program прописать

Код: c#
1.
2.
StreamReader reader = new StreamReader(ClassHelper.stream);
text += reader.ReadToEnd() + Environment.NewLine;



то данные доставать будет, но нужно внутри самого статического класса достать данные
...
Рейтинг: 0 / 0
05.11.2013, 14:06
    #38452995
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
Students, опереации чтения/записи с потоком изменяют позицию внутри него. Добавь в начало Read строку stream.Position = 0;

Кроме того: а) убери свойство ms и б) поле stream лучше сделать private полем
...
Рейтинг: 0 / 0
05.11.2013, 14:12
    #38453001
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
да, сделал как вы написали. я подумал, что для таких случаев (когда файл недоступен) лучше создать отдельный класс по типу ClassHelper, как я написал выше.

Теперь всё работает. Спасибо за ответы.
...
Рейтинг: 0 / 0
05.11.2013, 14:13
    #38453003
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
bazileStudents, опереации чтения/записи с потоком изменяют позицию внутри него. Добавь в начало Read строку stream.Position = 0;

Кроме того: а) убери свойство ms и б) поле stream лучше сделать private полем

если сделать private, то я не смогу вызывать его из класса Program и доставать оттуда данные
...
Рейтинг: 0 / 0
05.11.2013, 15:06
    #38453118
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в оперативной памяти найти экземпляр класса MemoryStream?
Studentsесли сделать private, то я не смогу вызывать его из класса Program и доставать оттуда данные
Для этого должен служить метод Read. То что класс ClassHelper использует MemoryStream для временного хранения данных являетя деталью реализации которые не надо напрасно "светить" наружу. В будущем будет труднее этот класс переделать.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли в оперативной памяти найти экземпляр класса MemoryStream? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]