如何告诉CreateFile我想要附加到现有文件?

时间:2014-04-15 20:48:32

标签: delphi delphi-2010 createfile

我正在使用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 个答案:

答案 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。 (该参数只记录了五个可能的值,因此查看列表并选择最符合您需求的列表并不需要很长时间。)