Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заменить в файле [D7, XP]


alert2006 ©   (2008-03-16 03:14:00) 

Как заменить в файле подстроку на строку чтобы файл не блокировался для доступа  ?


Плохиш   (2008-03-17 10:41:00) [1]


> SerJaNT ©   (17.03.08 08:57) [11]
> А как сделать без потоков? Проблема в том что пока программа
> будет писать в файл, копия этой же программы, но запущенная
> на другом компе через сеть не может тоже производить запись

Хороша логика :-)
Вторая программа пишет, пишет в файл, но тут первая программа взяла и файл переписала и все изменения в одно место.


SerJaNT   (2008-03-17 09:23:00) [2]

Спасибо, Slym! Все работает как надо.


Slym   (2008-03-17 09:18:00) [3]

Anatoly Podgoretsky ©   (17.03.08 0:44) [4]
только нафига здесь потоки не пойму

а нафига здесь стринглисты :)? убрал один TStringList, оставив второй только ради LoadFromFile/SaveToFile :) но можно и его убрать
var
 Templ:TStringList;
 S:string;
begin
 Templ:=TStringList.Create;
 try
   Templ.LoadFromFile(prog+'data/Templates/General/template_line.html');
   S:=templ.Text;
   S := Replace(S, '%DATE%', DateToStr(DateTimePicker1.Date));
   S := Replace(S, '%TIME%', edit1.text);
   S := Replace(templ.Text, '%PK%', combobox1.Items.Strings[combobox1.ItemIndex]);
   S := Replace(S, '%FIO%', combobox2.Items.Strings[combobox2.ItemIndex]);
   S := Replace(S, '%PLANE%', combobox3.Items.Strings[combobox3.ItemIndex]);
   S := Replace(S, '%DISCIP%', combobox4.Items.Strings[combobox4.ItemIndex]);
   S := Replace(S, '%MODULE%', combobox5.Items.Strings[combobox5.ItemIndex]);
   S := Replace(S, '%PROC%', combobox6.Items.Strings[combobox6.ItemIndex]);
   S := Replace(S, '%SIGN%', ' ');
   S := Replace(S, '%PRODUCT%', combobox7.Text);
   S := Replace(S, '%MARK%', ' ');
   S := Replace(S, '%MANAGER%', ' ');
   Templ.LoadFromFile(prog+'data/Templates/General/template.htm');
   Templ.text:=  Replace(Templ.text, '<!--HERE-->', S);
   Templ2.SaveToFile(prog+'data/Templates/General/template.htm');
 finally
   Templ.free;
 end;


Slym   (2008-03-17 09:10:00) [4]

Templ2.text:=  Replace(Templ2.text, '<!--HERE-->', templ.Text);
S_2.Position:=0;
Templ2.SaveToStream(S_2);


SerJaNT   (2008-03-17 09:03:00) [5]

и как можно выйти из ситуации?


Сергей М.   (2008-03-17 09:01:00) [6]


> как сделать без потоков?


TStringList.LoadFromFile/SaveToFile


> пока программа будет писать в файл, копия этой же программы,
>  но запущенная на другом компе через сеть не может тоже
> производить запись (ошибка "Файл занят")
>


И это абсолютно нормальная ситуация.
Файл - это не воз из басни Крылова


SerJaNT   (2008-03-17 08:57:00) [7]

А как сделать без потоков? Проблема в том что пока программа будет писать в файл, копия этой же программы, но запущенная на другом компе через сеть не может тоже производить запись (ошибка "Файл занят")


Сергей М.   (2008-03-17 08:53:00) [8]

Потоки тут нужны как корове седло


SerJaNT   (2008-03-17 08:50:00) [9]

Как переоткрыть поток?


SerJaNT   (2008-03-17 08:50:00) [10]

Как переоткрыть поток?


SerJaNT   (2008-03-17 01:19:00) [11]

Автор темы и есть я, просто через автозаполнение формы поставилось alert2006 а я не заметил


Anatoly Podgoretsky   (2008-03-17 00:53:00) [12]

А ты какое отношение имеешь к вопросу автора, заведи свою тему.


SerJaNT   (2008-03-17 00:47:00) [13]


> Надо переоткрыть поток


как?


Anatoly Podgoretsky   (2008-03-17 00:44:00) [14]

Надо переоткрыть поток, только нафига здесь потоки не пойму.


SerJaNT   (2008-03-17 00:19:00) [15]

Удалено модератором


SerJaNT   (2008-03-16 10:55:00) [16]

Спасибо!
Теперь все хорошо, только вот данные теперь просто дописываются в файл, а надо как-бы только изменить содержимое.

Делаю так:

Templ:=TStringList.Create;
Templ2:=TStringList.Create;
S_1 := TFileStream.Create(prog+'data/Templates/General/template_line.html', fmOpenReadWrite, fmShareDenyWrite);
S_2 := TFileStream.Create(prog+'data/Templates/General/template.htm', fmOpenReadWrite, fmShareDenyWrite);
Templ.LoadFromStream(S_1);
templ.Text := Replace(templ.Text, '%DATE%', DateToStr(DateTimePicker1.Date));
templ.Text := Replace(templ.Text, '%TIME%', edit1.text);
templ.Text := Replace(templ.Text, '%PK%', combobox1.Items.Strings[combobox1.ItemIndex]);
templ.Text := Replace(templ.Text, '%FIO%', combobox2.Items.Strings[combobox2.ItemIndex]);
templ.Text := Replace(templ.Text, '%PLANE%', combobox3.Items.Strings[combobox3.ItemIndex]);
templ.Text := Replace(templ.Text, '%DISCIP%', combobox4.Items.Strings[combobox4.ItemIndex]);
templ.Text := Replace(templ.Text, '%MODULE%', combobox5.Items.Strings[combobox5.ItemIndex]);
templ.Text := Replace(templ.Text, '%PROC%', combobox6.Items.Strings[combobox6.ItemIndex]);
templ.Text := Replace(templ.Text, '%SIGN%', ' ');
templ.Text := Replace(templ.Text, '%PRODUCT%', combobox7.Text);
templ.Text := Replace(templ.Text, '%MARK%', ' ');
templ.Text := Replace(templ.Text, '%MANAGER%', ' ');

Templ2.LoadFromStream(S_2);

Templ2.text:=  Replace(Templ2.text, '<!--HERE-->', templ.Text);

Templ2.SaveToStream(S_2);

Templ2.free;

Templ.free;
S_1.Free;
S_2.free;


и получается измененное содержимое файла template.htm дописывается еще раз в конец файла


Loginov Dmitry   (2008-03-16 08:22:00) [17]

> чтобы файл не блокировался для доступа


Открыть его с параметром fmShareDenyNone


Наверх

Титульная страница Поиск, карта сайта Написать письмо