需求:在向指定文件写数据时,同时能够打开文件并读取数据,并不出现文件被另一个程序占用的错误。
目前是用Tstringlist来存储串口发出来的数据,因为要求存储文件中只存最新接收的数据,所以在接收新的数据时要把以前的删掉,用Tstringlist可以用clear来清空列表,但用Tstringlist存数据时,如果打开读数据的话会出现共享错误。用什么方式来存,在打开时可以不出现文件被占用的错误先谢谢了。。
目前是用Tstringlist来存储串口发出来的数据,因为要求存储文件中只存最新接收的数据,所以在接收新的数据时要把以前的删掉,用Tstringlist可以用clear来清空列表,但用Tstringlist存数据时,如果打开读数据的话会出现共享错误。用什么方式来存,在打开时可以不出现文件被占用的错误先谢谢了。。
解决方案 »
- 要接分吗? 来啊! 不定期结贴!!
- ADOConnection 一次只能执行一条 SQL 语句,有没有解决办法?
- 打开WEBBROWSER时,怎样读取打开的页面的源文件,相当于“查看->源文件"
- 请问如何使Hints的Delete record为false ?
- 如何删除指定数量得计录 用SQL语言
- 菜鸟向高手请教,找不到QuickRep,怎么会这样?谢谢!
- Delphi5.0 & Paradox
- 打印窗口内容,100分立即送。
- 如何在调试过程中修改一个长度超过了255的string型变量?
- 如何作出象IE收藏选项里的动态菜单
- Interface not supports
- fastreport问题
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate); //以fmCreate方式创建一个流
try
SaveToStream(Stream);//然后将StringList中的内容,保存到流中,即保存就文件中
finally
Stream.Free;
end;
end;再看看TFileStream.Create(FileName, fmCreate); 是如何处理的
TFileStream的构造函数
constructor TFileStream.Create(const FileName: string; Mode: Word);
begin
{$IFDEF MSWINDOWS}
Create(Filename, Mode, 0);//调用另一个重载构造函数
{$ELSE}//重载的构造函数Create
constructor TFileStream.Create(const FileName: string; Mode: Word; Rights: Cardinal);
begin
if Mode = fmCreate then
begin
inherited Create(FileCreate(FileName, Rights)); //这里调用FileCreate函数创建文件 if FHandle < 0 then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]); //如果失败,就抛出异常,如LZ程序中的错误提示
end再看看SysUntil.pas单元中,FileCreate这个函数如何处理function FileCreate(const FileName: string): Integer;
{$IFDEF MSWINDOWS}
begin
Result := Integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
end;从上看出是调用windows的api CreateFile来创建文件,而且是以CREATE_ALWAYS这个标志来创建文件的从MSDN中可查到,CREATE_ALWAYS这个标志,表示,
Creates a new file. If the file exists, the function overwrites the file and clears the existing attributes.所以,如果在文件已经被打开的情况下,使用CREATE_ALWAYS的方式来保存到这个文件,就会出现LZ程序中的错误提示
classes.pas,SysUntil.pas这些单元文件是在什么地方放啊?
非常感谢你这么透彻的分析
分已送出,请查收。。