Длина отображаемого в память файла

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

Мы можем проверить свойство CAPACITY, но я думаю, что оно возвращает размер в байтах.

Чтобы было понятнее, я объясняю сценарий. Я создаю файл с отображением памяти A. Я пишу «Привет», когда создаю его. Это работает нормально. Теперь я хочу записать «Мир» в существующий файл A.

Я использую для этого код ниже:

 var file = MemoryMappedFile.OpenExisting("myFile");
            string str = "String to append";
            using (var view = file.CreateViewAccessor())
            {
                using (var stream = file.CreateViewStream())
                {
                    System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
                    writer.Write(str.ToArray(), INT SIZE,Convert.ToInt32(view.Capacity), str.Length);//Error
                }
            }
            using (var stream = file.CreateViewStream())
            {
                Console.WriteLine("Reading appended File");
                System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
                Console.WriteLine(reader.ReadString());
                Console.WriteLine(string.Empty);
            }

Я отметил строку (//), которая запрашивает размер. Я хочу знать значение для (INT SIZE). Будем признательны за любую помощь.

[EDIT] Я использую C#, Visual Studio 2010.

Теперь я использую этот код для добавления:

var file = MemoryMappedFile.OpenExisting("myFile");
            string str = "String to append";
            string str1 = string.Empty;


            using (var stream = file.CreateViewStream())
            {
                System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);

                str1 = reader.ReadString();
                str1 = str1 + "\n" + str;

                System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
                writer.Write(str1);
            }
            using (var stream = file.CreateViewStream())
            {
                Console.WriteLine("Reading appended File");
                System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
                Console.WriteLine(reader.ReadString());
                Console.WriteLine(string.Empty);
            }

Но ничего не добавляет. Не могли бы вы проверить мой код?


person Deepak Kumar    schedule 07.03.2012    source источник


Ответы (1)


Вы не можете добавить к строке в потоке, написав после нее дополнительный символ, так как это не изменит длину уже записанной строки.

Кроме того, нет метода BinaryWriter, который позволяет вам писать в определенную позицию в потоке, подобно этому. Для перегрузки, которая принимает массив символов и два целых числа, второй параметр указывает позицию в массиве, а не позицию в потоке.

Если вы хотите изменить строку, записанную в потоке, вы должны прочитать строку из потока и перезаписать поток новой строкой.

person Guffa    schedule 07.03.2012
comment
Спасибо за ответ. Не могли бы вы перепроверить мой вопрос? Я попробовал это, как я понял из вашего ответа. Но это не работает. - person Deepak Kumar; 07.03.2012
comment
@Deepak: Вы должны сбросить или снова открыть поток перед записью в него, иначе вы продолжите запись с того места, где остановили чтение, поэтому исходная строка по-прежнему остается первой строкой в ​​потоке. - person Guffa; 07.03.2012
comment
Привет Гуффа, у меня проблема. Можете ли вы ответить здесь? или мне спросить на ТАК? - person Deepak Kumar; 09.03.2012
comment
Если вы видите эту проблему, stackoverflow.com/questions/9631778 / - person Deepak Kumar; 09.03.2012
comment
Подскажите, пожалуйста, ответ на главный вопрос: Memory Mapped File Length. - person Sawan; 05.03.2013
comment
@MohamedSakherSawan: длина файла отображения памяти равна емкости. Если вы открываете файл как файл с отображением памяти, это длина файла. Если вы создаете новый файл отображения памяти, вы сами указываете объем. - person Guffa; 05.03.2013
comment
Но когда вы пытаетесь прочитать файл с отображением памяти, он читает больше, чем его емкость, как минимум, он читает 4096 байт! - person Sawan; 05.03.2013
comment
@MohamedSakherSawan: я не вижу способа открыть файл с отображением памяти, емкость которого меньше размера файла? Вы имеете в виду, что вы читаете файл, используя FileStream, который был создан с использованием файла с отображением памяти? - person Guffa; 05.03.2013
comment
Я создал файл с отображением памяти, но не могу прочитать все его содержимое, я задал два вопроса: stackoverflow.com/questions/15229166/ stackoverflow.com/questions/14953393/ - person Sawan; 05.03.2013
comment
@MohamedSakherSawan: Дальнейшее исследование показывает, что файл сопоставления памяти знает точную емкость, но абсолютно ничего не скажет вам. Емкость аксессора представления не ограничивается емкостью фактического отображаемого файла памяти, вместо этого он возвращается на целых системных страницах. - person Guffa; 05.03.2013