如何告诉CreateFile我要向现有文件追加内容?

3

我正在使用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); 

非常感谢,
这是需要翻译的内容。

2
为什么不使用TFileStream呢?它是该API的易于使用的包装器。或者使用CreateFileTHandleStream - Sir Rufo
2个回答

3
我怀疑在这里你实际上需要的是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,所有写入都将添加到文件末尾,而无论文件指针的当前值是什么。
根据文档的说法:
对于文件对象而言,追加数据到文件的权限。(对于本地文件,如果没有使用FILE_WRITE_DATA标志,则写操作不会覆盖现有数据。)
请注意,旧版本的 Delphi 不定义 FILE_APPEND_DATA,因此您需要:
const
  FILE_APPEND_DATA = $0004;   

尽管如此,我认为,流或写入器类在这里是更好的选择。您确定要深入使用Win32 API吗?


3
在调用CreateFile()函数时,你可以在dwDesiredAccess参数中选择仅使用FILE_APPEND_DATA标志而不使用FILE_WRITE_DATA标志,这样系统会自动将数据附加在文件末尾,无需手动寻找文件末尾位置。请注意,此操作不会改变原始文件内容。 - Remy Lebeau
@RemyLebeau 你好Remy,感谢您的回复。我不确定是否遗漏了什么,但我已经尝试使用FILE_APPEND_DATA,但它显示FILE_APPEND_DATA未声明。我正在使用Delphi 2010。这是我的操作:fHandle:= CreateFile(PChar(FName),FILE_APPEND_DATA,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); - d.b
@d.b:FILE_APPEND_DATA 已经在 XE 版本的 Windows 单元中添加。 - Remy Lebeau

1
在第二个参数中指定您想要的File_Append_Data访问权限,而不需要请求File_Write_Data访问权限。然后所有写入都将在文件末尾进行。
要打开一个文件,如果它不存在则创建它,请将Open_Always传递给dwCreationDisposition参数。(该参数只记录了五个可能的值,因此很快就可以查看列表并选择最符合您需求的那个。)

嗨,罗布,感谢您的回复。我不确定是否遗漏了什么,但我已经尝试使用FILE_APPEND_DATA,它说FILE_APPEND_DATA未声明。我正在使用Delphi 2010。这是我的操作:fHandle:= CreateFile(PChar(FName),FILE_APPEND_DATA,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); - d.b
你可以自己声明它。它的值是4。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接