вставка и удаление строк в файл в дотнете

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

вставка и удаление строк в файл в дотнете

Сообщение dklmn » 02.05.2006 (Вт) 8:35

Наверно вопросы которые собираюсь относятся к категории "ламерских", но что та как то примеры из Msdn ясности не внесли..
Как грамотно вставить и удалить строку в некое произвольное место текстового файла? Считывать подряд все строки в , допустим коллекцию потом вставлять или удалять оттуда элемент и потом снова все элементы писать в файл построчно? - как то некрасиво уж не говоря о том что файл может быть большой а памяти мало (мне это надо под платформу Pocket Pc).
Как это иначе сделать?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 02.05.2006 (Вт) 8:40

Поние ПОТОК знакомо?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

Сообщение dklmn » 02.05.2006 (Вт) 10:15

Sebas писал(а):Поние ПОТОК знакомо?

Конечно, хотя скорее теоретически. Только работа с файлом тут при чем?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 02.05.2006 (Вт) 13:03

по кускам читаешь, анализуруешь, изменяешь, записываешь.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

Сообщение dklmn » 03.05.2006 (Ср) 8:32

Sebas писал(а):по кускам читаешь, анализуруешь, изменяешь, записываешь.

В смысле записываешь в другой файл и потом в конце первый удаляешь а второй переименовываешь чтоли?
Вот например в 1с (не кидайте в меня камнями, я не ставляю егов пример для подражаения), это делатется так....
;***************
ТекстДок = СоздатьОбъект("Текст");

ТекстДок.Открыть("catalog.txt");

ТекстДок.ЗаменитьСтроку(52, "Работы ..., 3056 ..75 000 руб.");
;**********************
Я думал что в дотнете с его разнообразиме всяких классов тоже есть что то такое , как грится, интуитивно понятное..

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.05.2006 (Ср) 11:56

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

sebas<-@->mail.ru

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.05.2006 (Ср) 12:05

Для уменьшения наивности стоит посмотреть на описание класса Stream и его родственников
Весь мир матрица, а мы в нем потоки байтов!

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

Сообщение dklmn » 03.05.2006 (Ср) 12:48

Sebas писал(а):И ты, наивный, естественно подумал, что файл не загружается целиком?

вы таки будете смеяться , но именно так я и думал
То есть я был уверен что когда выполняется такой код..
**********************
Код: Выделить всё

Dim sr As StreamReader = New StreamReader(flName, System.Text.Encoding.GetEncoding(1251))
         Do
            OneString = sr.ReadLine()
.......

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

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.05.2006 (Ср) 12:53

как раз в этом случае, загружается строка
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.05.2006 (Ср) 13:57

Открытие файла и чтение из файла строки (или каких-либо других данных) вещи несколько разные. Можно открыть файл и считывать из него нужные данные частями по мере необходимости. При больших размерах файла - это единственный способ работы с ним. Иначе память накроется мышиным ковриком...

З.Ы. Я надеюсь этот топик не мутирирует в топик типа "Как изменить файл не открывая его?"
Весь мир матрица, а мы в нем потоки байтов!

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

Сообщение dklmn » 03.05.2006 (Ср) 14:26

Sebas писал(а):как раз в этом случае, загружается строка

Ты хочешь сказать что при чтении он могет считываться построчно а при записи по любому считывает сначала целиком файл?
Я продолжу наверно раскрывать свою наивность , но в моем представлении запись в файл происходит так,
- операционка ищет свободный кластер (кластеры над диске) - пишет туда нужную строку, потом после записи очередного кластера она тут же перестраивает таблицу ссылок( ну по крайней мере для FAT).
И по большому счету файловой системе должно быть по барабану, - вставляется строка в конец файла или в иное место, - разве что лишнюю ссыку придется в таблице переделать.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.06.2006 (Чт) 15:33

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

Не вдаваясь в подробности доступа файловой системы к отдельным кластерам остановимся на уровне API, ибо .NET в на данном этапе своего существования всего-лишь обертка.

При создании (открытии) файла создается объект ядра имеющий свой описатель. При этом файл не считывается полностью в память. Используя этот описатель можно получить различные свойства файла, а также записывать в него в любую позицию и считывать из него с любой позиции.

При чтении же так называемого "текстового" (не будем придираться к терминам, надеюсь все понимают о чем речь) файла, для того чтобы считать и заменить строку с конкретным номером, необходимо до нее вначале добраться и определить ее положение. Поэтому в данном случае придется вначале считать все строки до нее (или найти нужное количество разделителей строки, а для этого опять же считать какое-то количество байтов), считать саму строку, заменить ее а потом записать все заново, не забыв сместить оставшуюся часть файла в случае если новая строка имеет другой размер. Но и при этом целиком файл в память не загружается.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90

    TopList