![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заменить в файле [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