按照帮助说明,当使用fmCreate参数时,如果文件存在则以只写方式打开,否则创建。在实际使用过程中,Win7上是没有以只写方式打开,而是直接强制创建新文件了。
跟踪源码到SysUtils单元中的FileCreate函数:
Result := Integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
原来调用的是CreateFile的API,根据该API说明。显然,同时兼顾创建和只写打开两种方式是不现实的。例如:当文件存在时,以fmCreate参数创建的文件要正确判断用户到底是重置文件所有属性(相当于新建文件)还是以只写方式打开这两种情况是不可能的。改写所有系统架构这种说法咱们就不用考虑了,所以在创建文件时还是老老实实自己判断才是王道。小坑一个,记录在此。正确姿势如下:
if FileExists(AFileName) then
Result := TFileStream.Create(AFileName, fmOpenWrite)
else
Result := TFileStream.Create(AFileName, fmCreate);