我想创建一个.txt
文件,并在运行时随时写入。为此,我使用AssignFile()
函数。但是在我的文件已经存在的情况下我遇到了麻烦。我收到一条错误消息:文件访问被拒绝。
为了更好地解释,请参阅以下两个示例:
Ex1:如果我第一次在文件不存在时调用AssignFile()
,好的!但是,如果文件存在,则不起作用。
Ex2:如果我第二次致电AssignFile()
(第一次成功AssignFile()
时),这也无效。
这是AssignFile()
函数中的错误吗?
var
myfile: TextFile;
Procedure WriteFileContent(const MyTxtFile: string; MyNumber: DWORD);
var
F: TextFile;
Begin
If FileExists(MyTxtFile) Then
Begin
AssignFile(F, MyTxtFile);
Rewrite(F);
Writeln(F, '0x' + IntToHex(MyNumber,8));
CloseFile(F);
End;
End;
begin
try
// Calling AssignFile() by first time
AssignFile(myfile, 'myfile.txt');
Rewrite(myfile);
CloseFile(myfile);
setfileattributes('myfile.txt', FILE_ATTRIBUTE_HIDDEN);
Sleep(5000);
// Calling AssignFile() by second time
WriteFileContent('myfile.txt', 123456789);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
答案 0 :(得分:7)
AssignFile()
失败,但您对Rewrite()
属性设置的Hidden
的调用。以下解释:
通常,您致电Rewrite(F)
以删除文件,并在随后的Write(F, ...)
或WriteLn(F, ...)
来电中将新数据写入其中。
来自docs(System.Rewrite):
如果已存在具有相同名称的外部文件,则会将其删除 并在其位置创建一个新的空文件。
使用Append()
命令打开文件进行写入没有问题。
(基于上面我得出的结论是,删除失败了 Access denied 消息。这太过分了。)
被评论打败我追踪了代码,并将实际代码与CreateFile的MSDN文档进行了比较:
实际代码:
// if mode is fmOutput (as it is for Rewrite)
OpenMode = GENERIC_WRITE
Flags = CREATE_ALWAYS
// ...
Temp := CreateFile(t.Name, OpenMode, FILE_SHARE_READ, nil, Flags, FILE_ATTRIBUTE_NORMAL, 0);
如果指定了CREATE_ALWAYS和FILE_ATTRIBUTE_NORMAL,则为CreateFile 如果文件失败并将最后一个错误设置为ERROR_ACCESS_DENIED 存在且具有FILE_ATTRIBUTE_HIDDEN或FILE_ATTRIBUTE_SYSTEM 属性。
使用Rewrite()
属性在现有文件上调用hidden
会失败。