Отредактировать текстовый файл в FSO

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Отредактировать текстовый файл в FSO

Сообщение Lexoos » 24.01.2006 (Вт) 11:14

Доброе время суток!
Подскажите плиз, как в FSO отредактировать (а не переписывать весь файл) одну из строк текстового файла (строки произвольной длины)?
Или какие другие подходящие средства подскажите?
Заранее благодарен за помощь!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.01.2006 (Вт) 11:33

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

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 24.01.2006 (Вт) 11:37

а может какие другие способы работы с текстовыми файлами есть, которые позволяют редактировать одну из строк произвольной длины?

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 24.01.2006 (Вт) 11:44

Я таким образом заменил только "regedit" на "regedit" в текстовом файле. Пример, конечно, примитивен. Код надо доработать, но работает.

f = FreeFile()
i = 0
Open "w:\tempfolder\Копия Reg.txt" For Binary As #f
While Not EOF(f)
Input #f, St
Put #1, InStr(St, "regedit"), Replace(Mid(St, InStr(St, "regedit"), 7), "regedit", "regedot")
Wend
Close #f


Это то, что надо или нет?

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 24.01.2006 (Вт) 11:48

Разумеется, сначала идет проверка:
If InStr(St, "regedit")>0 Then ...

Можно просто
Put #1, InStr(St, "regedit"), "regedot"

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 24.01.2006 (Вт) 11:51

мне то в принципе нужно редактировать только одну конкретную строку целиком, а не отдельные слова в ней (но вот проблема, строка энта может быть разной длины)

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 24.01.2006 (Вт) 11:53

Есть примерный файл, в котором надо заменить текст?
Можно было бы с ним попробовать.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2006 (Вт) 11:56

Я фигею с этой дискуссии...

Lexoos
Объясни, что из перечисленного вызывает проблему конкретно.
  • Открыть файл
  • Прочитать содержимое в переменную
  • Изменить содержимое переменной
  • Записать переменную в файл
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 24.01.2006 (Вт) 12:06

Ну я рад за тебя. Видно точно фигеешь, если не понял, нужно в текстовом файле заменить скажем третью строку длиной 23 (а может и 45) символов на другую строку не переписывая остальных 20 строк.

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 24.01.2006 (Вт) 12:09

Вот прмиерный файл и в нем препоследнюю строку нужно заменить на строку "654321" не переписывая по новому остальных.

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 24.01.2006 (Вт) 12:10

"
C:\Documents and Settings\User\Desktop\Base\proga.exe
5
1234567
100
"

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 24.01.2006 (Вт) 12:23

Вот пример кода, который заменяет все строки "диски" на "хрень".

Private FSO As FileSystemObject
Private Fl As Object
Private Fle As Object

Private Sub Form_Load()
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Fl = FSO.OpenTextFile("w:\tempfolder\Scan.rep", ForReading, True, TristateUseDefault)
Set Fle = FSO.OpenTextFile("w:\tempfolder\Scan1.rep", ForAppending, True, TristateUseDefault)
Fle.Write Replace(Fl.Read(FileLen("w:\tempfolder\Scan.rep")), "диски", "хрень")
Fle.Close
Fl.Close
FSO.DeleteFile "w:\tempfolder\Scan.rep", True
FSO.MoveFile "w:\tempfolder\Scan1.rep", "w:\tempfolder\Scan.rep"
End Sub


Введи свои данные. Напиши результат.

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 24.01.2006 (Вт) 12:28

спасибо за помощь!
проблему решил, но немного иначе - скачал класс для работы с ini файлами, все работает

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.01.2006 (Вт) 13:10

Хочу заметить что GSerg (ну и я) был прав - на "физическом" уровне запись в файл осуществляется именно таким способом: прочитал, изменил, записал. Других способов НЕТ.
(ну кроме, конечно, прямой записи на диск :wink: )
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2006 (Вт) 13:16

Lexoos писал(а):Видно точно фигеешь, если не понял, нужно в текстовом файле заменить скажем третью строку длиной 23 (а может и 45) символов на другую строку не переписывая остальных 20 строк.

Я фигею не с вопроса, я фигею с диалога, в чём можно убедиться, внимательно перечитав мой пост.
Диалог офигительный, в свете сказанного Twister'ом чуть выше, ибо тесно граничит с вопросом "Как прочитать файл, не открывая его", а также потому, что специально подчёркивается несуществующая разница между строками разной и одинаковой длины.

http://bbs.vbstreets.ru/viewtopic.php?t=22749
Геморрой распространяется... :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 25.01.2006 (Ср) 9:28

Опять же, надобно читать внимательно и ответы и понимать логику конкретного человека в изложении его мыслей (в этом беспорно геморой проявляется в разной степени), а не в своей логике выстраивать существующие ответы прочитав осмысленно только первые слова или выдернув знакомые.
И ежу наверное понятно, что данные файла невозможно прочитать, а тем более изменить, не открыв его. А критерий длины строк я думаю довольно значимый в выборе методов работы с ними (допустим файлы последовательного, произвольного доступа или двоичные). Бесспорно, можно конечно подсчитывать длину строк искать символ возврата коретки, но на фига козе баян, если необходимую задачу можно выполнить значительно быстрее, а главное проще?
Вот, можно так сказать, мораль или подоплека вопроса.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.01.2006 (Ср) 9:37

Lexoos писал(а):Бесспорно, можно конечно подсчитывать длину строк искать символ возврата коретки, но на фига козе баян, если необходимую задачу можно выполнить значительно быстрее, а главное проще?

Нельзя.
Попробуй подумать.
Например о том, что если ты изменишь длину строки, то все последующие байты файла надо сдвинуть вперед или назад. Из чего следует, что файл в любом случае придется переписывать.
Можно оптимизировать данную операцию, переписывая не весь файл, а только смещаемую часть (хотя это не даст эффекта, если будут изменяться первые строки), но если бы ты мог это сделать, то не задавал бы таких вопросов.
Lasciate ogni speranza, voi ch'entrate.

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 25.01.2006 (Ср) 11:04

Это я уже понял и разобрался в своем вопросе. Спасибо Вам за разъяснения и помощь.
Малость возмутило только то, что большинство с высока так посмотрели на мой вопрос (может быть и детский) и наср.. сюда вместо того чтоб разъяснить что к чему и намекнуть, как решить задачу.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.01.2006 (Ср) 11:22

Возможно дело в том, что твой вопрос не оригинален и поиском по форуму находится минимум трижды.
Lasciate ogni speranza, voi ch'entrate.

Lexoos
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 02.12.2005 (Пт) 8:54

Сообщение Lexoos » 25.01.2006 (Ср) 12:55

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.01.2006 (Ср) 13:00

Поищи по "Line Input", а потом скажи, что такой задачи на форуме не было.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 24

    TopList