我正在使用Delphi 2010并寻找一种方法来使用CreateFile Windows API函数来附加数据而不是在指定的文件中覆盖它?
我不是在寻找一种可选的方法,例如Append()或Rewrite()或类似方法。我正在寻找通过使用CreateFile Windows API函数来实现这一目的。
我尝试使用:
// this will open existing file but will **overwrite** data in the file.
fHandle:= CreateFile(PChar(FName), GENERIC_READ or GENERIC_WRITE, 0,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// this will recreate file each time therefore deleting its original content
fHandle:= CreateFile(PChar(FName), GENERIC_READ or GENERIC_WRITE, 0,
nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
非常感谢,
答案 0 :(得分:2)
我怀疑OPEN_ALWAYS
实际上是你需要的。
始终打开文件。 如果指定的文件存在,则函数成功,最后一个错误代码设置为 ERROR_ALREADY_EXISTS (183)。
如果指定的文件不存在并且是可写位置的有效路径,则该函数会创建一个文件,并将最后一个错误代码设置为零。
如果您正在撰写,则可以删除GENERIC_READ
。
我预计的另一个问题是,当文件打开时,文件位置设置为文件的开头。寻求最终解决这个问题。
Win32Check(SetFilePointerEx(fHandle, 0, nil, FILE_END));
或者,您可以使用FILE_APPEND_DATA
代替GENERIC_WRITE
。
Handle:= CreateFile(PChar(Name), FILE_APPEND_DATA, 0,
nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
当您使用FILE_APPEND_DATA
时,假设您还没有使用FILE_WRITE_DATA
,则无论文件指针的当前值如何,都会对文件的末尾进行所有写入。
documentation这样说:
对于文件对象,有权将数据附加到文件。 (对于本地文件,如果在没有 FILE_WRITE_DATA 的情况下指定了此标志,则写操作不会覆盖现有数据。)
请注意,旧版本的Delphi没有定义FILE_APPEND_DATA
,因此您需要:
const
FILE_APPEND_DATA = $0004;
所有这些都说,我怀疑,流或作家类在这里是更好的选择。你确定要使用Win32 API搞砸了吗?
答案 1 :(得分:1)
在第二个参数中指定您希望File_Append_Data
访问,而也请求File_Write_Data
访问权限。然后所有写入都将在文件的末尾。
要打开文件,如果文件尚不存在则创建文件,请为Open_Always
参数传递dwCreationDisposition
。 (该参数只记录了五个可能的值,因此查看列表并选择最符合您需求的列表并不需要很长时间。)