怎么关掉文件?

gaolin 2005-09-27 04:24:51
我有一段程序,实现的功能是,先载入文件模板,然后填充文件后存为目标文件,但是我现在按钮空间里面的程序执行一次可以正常执行,第二此运行的时候就会出现EFOpenERror错误,不能打开文件,我该怎么作是操作完后关掉文件还是另外作什么?
.....
mystring1.LoadFromFile('..\前端对象\objmodel.pas');
temp2:='';
temp2:= 'Xfield:string;';
mystring3.Add('操作的字符串'); //给mystring3赋值
mystring2.Text:= StringReplace(mystring1.Text,temp2,mystring3.Text,[rfReplaceAll]);//替换mystring1中包含mystring3的内容;
//修改后的内容保存为另外的文件;
if SaveDialog1.Execute then
begin
//SaveDialog1.FileName:=fname;
s:=ExtractFileName(SaveDialog1.FileName);
if ExtractFileExt(s)='.pas' then
s:=copy(s,1,length(s)-4);
mystring2.SaveToFile(SaveDialog1.FileName);
end;
...全文
366 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaolin 2005-09-29
  • 打赏
  • 举报
回复
就是
omgsunny 2005-09-29
  • 打赏
  • 举报
回复
弄成绝对路径就行了么?
gaolin 2005-09-29
  • 打赏
  • 举报
回复
搞定!感谢各位!!
gaolin 2005-09-29
  • 打赏
  • 举报
回复
对对!!如果我改成决定路径就可以了,但是,我们程序不是一个人用,项目组的人从sourse safe上把程序check out到自己电脑上的路径都不一样啊
gaolin 2005-09-29
  • 打赏
  • 举报
回复
to senfore(来而不往非礼也!) 判断文件存在与否怎么判断?
omgsunny 2005-09-29
  • 打赏
  • 举报
回复
up
xixuemao 2005-09-28
  • 打赏
  • 举报
回复
晕,为什么我这里测试就没有问题呢?

把demo发给我我试试!xixuemao@sohu.com
gaolin 2005-09-28
  • 打赏
  • 举报
回复
不修改一样,我试过的,只要执行了保存的代码后就不能执行第二此了
xixuemao 2005-09-28
  • 打赏
  • 举报
回复
我说把你修改打开文件的部分注视掉试试看啊?

你打开后别作修改直接保存,多点几次试试,没道理出问题的。
gaolin 2005-09-28
  • 打赏
  • 举报
回复
up
senfore 2005-09-28
  • 打赏
  • 举报
回复
mystring1.LoadFromFile('..\前端对象\objmodel.pas');

这句就是这个样子的么??你用相对路径呀???我觉的问题出在这里哦。。。


程序有个工作路径哦。。而且工作路径会改变的。。第一次你的‘..\前端对象\objmodel.pas'指的可能是’c:\前端对象\objmodel.pas',但在你进行了一次操作后。。那么工作路径就改变了。。再次打开的时候。。那么它寻找的就是‘c:\前端对象\..\前端对象\objmodel.pas'的这个文件了。。所以你应该在代码里在加载文件的时候判断文件是否存在哦。。
例如:在每次mystring1.LoadFromFile('..\前端对象\objmodel.pas');前进行判断。。这样你就指导问题所在了。。写程序很少使用相对路径的。。都是通过程序所在路径来判断其它文件所在的位置。。然后得到一个绝对的位置。。直接使用相对路径的不多。。
gaolin 2005-09-28
  • 打赏
  • 举报
回复
up
gaolin 2005-09-28
  • 打赏
  • 举报
回复
但是我这段程序每次第一次执行能够正常执行,第二此点击button控件就出现EFOpenERror错误,不能打开文件;如果关掉程序后重新运行才行
omgsunny 2005-09-28
  • 打赏
  • 举报
回复
我觉得可能是你的文件比较大,有些对象没有释放内存导致出错,可以看看savetofile()方法在delphi里面是怎么定义的. 里面用到了WriteBuffer,CreateRes等方法, 我在流操作中也遇到了这个问题,就是运行几遍之后容易出错.现在也闹不明白,等高人解决.
gaolin 2005-09-28
  • 打赏
  • 举报
回复
to senfore(来而不往非礼也!)
是!如果没有if SaveDialog1.Execute then
begin
s:=SaveDialog1.FileName;
if ExtractFileExt(s)='.pas' then
s:=ChangefileExt(SaveDialog1.FileName,'');
mystring1.SaveToFile(s);
s:=ChangefileExt(s,'')
end;
单独就mystring1.SaveToFile(s);
没有任何问题
gaolin 2005-09-28
  • 打赏
  • 举报
回复
我现在单独建了一张页面就在button空间中写了procedure TForm2.Button1Click(Sender: TObject);
var
mystring1,mystring2,mystring3,mystring4,mystring5,mystringobj:tstringlist;
s:string;
begin
mystring1:=tstringlist.Create;
mystring1.LoadFromFile('..\前端对象\objmodel.pas');
if SaveDialog1.Execute then
begin
s:=SaveDialog1.FileName;
if ExtractFileExt(s)='.pas' then
s:=ChangefileExt(SaveDialog1.FileName,'');
mystring1.SaveToFile(s);
s:=ChangefileExt(s,'')
end;
mystring1.Destroy;


ShowMessage('成功生成数据访问对象');
end;

运行第二此还是出现同样的问题,应该是要把句柄释放掉,但是就是不知道怎么释放
gaolin 2005-09-28
  • 打赏
  • 举报
回复
我是使用的tstringlist
senfore 2005-09-28
  • 打赏
  • 举报
回复
晕。。我使用Tstringlist的Savetofile没有你这样的问题。。。所以你肯定是前面的代码有问题吧。。
gaolin 2005-09-28
  • 打赏
  • 举报
回复
但是我这么写和你的写法和功能上,和我文的问题没有任何冲突啊,就是就你说的这么写还是同样的问题
senfore 2005-09-28
  • 打赏
  • 举报
回复
s:=ChangefileExt(s,'')
加载更多回复(17)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧