Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: перейти на строку и записать текст, как сделать? Добавлено: 19.05.06 00:55  

Автор вопроса:  ZXC
Есть файл, надо перейти на определённую строку ( номер строки я знаю) и затереть её и записать свой текст, как сделать? пробовал в массив, но чот не получилось :(

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 Padre



ICQ: 346632205 

Вопросов: 25
Ответов: 215
 Web-сайт: localhost
 Профиль | | #1
Добавлено: 19.05.06 01:48

Может быть вот это поможет:
http://forum.sources.ru/index.php?showtopic=142242

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 19.05.06 03:46
пробовал в массив, но чот не получилось

Правильным путем идешь товарищЪ! :-)

Поэтапно это будет выглядеть примерно так:
- Используя System.IO.TextReader.ReadLine получаешь массив строк (для VS 2005 это несколько проще)
- Затем меняешь нужную строку на свою.. Например: Lines(7) = "My New String"
- Далее через System.IO.TextWriter.WriteLine записываешь все строки обратно в файл.

Вот, собственно и все..

Ответить

Номер ответа: 3
Автор ответа:
 ZXC



Вопросов: 30
Ответов: 106
 Профиль | | #3 Добавлено: 19.05.06 05:23
Может быть вот это поможет:
http://forum.sources.ru/index.php?showtopic=142242

ага, тока там vb6 :( на .NET х.з как

(для VS 2005 это несколько проще)

у меня VS2005, можешь показать насколько проще? я пока пороюсь в MSDN, если не найду буду твой ответ ждать :) я щас пробовал чот не получается у меня никак, куда тут переменную с содержимым файла воткнуть? :)

Ответить

Номер ответа: 4
Автор ответа:
 ZXC



Вопросов: 30
Ответов: 106
 Профиль | | #4 Добавлено: 19.05.06 06:09
Чот не получаеться ни как :( EROS если нетрудно можеш показать на простом примерчике как реализовать всё это? спасибо

Ответить

Номер ответа: 5
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #5 Добавлено: 19.05.06 08:43

Массив нафиг не нужен. Делаешь цикл, счетчик цикла дает тебе номера строк. Потом, как EROS говорит, Считываешь строки по одной и тут же пишешь их в новый файл, если счетчик цикла дает тебе нужную строку пишешь ее, и крутишься в цикле дальше, до конца.
Типа:

        sw = New System.IO.StreamWriter(PathOUT)
        sr = New System.IO.StreamReader(PathIN)

        Try
            For i = 1 To SizeFile/2
                Str = sr.ReadLine()
                If i = x Then
                    sw.WriteLine(mast_str)
                Else
                    sw.WriteLine(Str)
                End If
            Next
        Catch ex As Exception
            sw.Close()
            sr.Close()
        End Try

Ну я б так делал.

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 19.05.06 14:54
dr.Faust
Во-первых.. откуда тебе заранее знать количество строк в файле?
Во-вторых.. Откуда взялась переменная SizeFile/2 что это? Если я правильно понимаю, то это и есть конечная величина счетчика строк? хмм.. ты этим самым преднамеренно провоцируешь возникновение ошибки! Разумеется, ты ее перехватываешь, но все же как это криво.. (имхо)
В третьих.. если уж на то пошло, то зачем записывать опять строки которые остались без изменений? Не проще ли их просто пропустить?

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 19.05.06 15:04
А я бы написал так...

        Dim filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, _
                                                "Текстовый документ.txt";)

        Try
            Dim Lines() As String = System.IO.File.ReadAllLines(filePath)
            Lines(4) = "My New string line"
            System.IO.File.WriteAllLines(filePath, Lines)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error in replace line";)
        End Try

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 19.05.06 15:07
ZXC, это для VS 2005! в более ранних версиях это работать не будет...

Ответить

Номер ответа: 9
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #9 Добавлено: 19.05.06 16:40
SizeFile/2 - Размер файла деленный на 2 - максимально возможное количество строк.

Ответить

Номер ответа: 10
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #10 Добавлено: 19.05.06 16:45

Согласен, твой пример красивее.

Мучает меня только динамический массив, если файл большой - будет жрать память, хотя для PC это не проблема. Для PDA уже почти привык экономить.

Ответить

Номер ответа: 11
Автор ответа:
 Sergey



ICQ: 283551900 

Вопросов: 1
Ответов: 74
 Профиль | | #11 Добавлено: 19.05.06 18:11
Можно и не через динамический массив.

Возможно 3 варианты
1-длина новой строки меньше старой
2-длина новой строки равно старой
3-длина новой строки больше старой

2) просто вписываешь строку в нужное место.

1) вписываешь строку в нужное место а потом сдвигаешь все данные после строки сдвигаешь к началу файла на разность длины новой и старой и режиш файл нужной длины.
Пусть:
Старая строка начинается с 158 байта и длиной 5 байт
Новая строка длиной 3 байта.

Тогда в позицию пишешь 158 строку 3 байта и ее конец будет в позиции 161 байт
Читаешь в буфер X байт после старой строки (158+5) и пишешь после новой (158+3) далее читаешь после (158+5+X) X1 байт и пишеш после (158+3+X) и т.д.


3) – тоже самое что и 1 но сначала надо увеличить файл потом сдвигать в коней(начинать с конца) и в образовавшийся промежуток вписать строку.

Ответить

Номер ответа: 12
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 19.05.06 20:00
Мучает меня только динамический массив, если файл большой - будет жрать память

А если файл большой, и приложение критично к памяти, то и подход должен быть другой. Например через Stream.Position...
Я пошел по самому легкому пути, предположив что у него файл небольшого размера..
А SizeFile/2... все равно я считаю, что так делать не следует...

Ответить

Номер ответа: 13
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #13 Добавлено: 19.05.06 20:11
Sergey,
вписываешь строку в нужное место

А как ты планируешь найти ТО САМОЕ МЕСТО?
Как ты найдешь к примеру начало и конец 6-й строки? Ведь нам ничего, кроме номера строки неизвестно...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам