我想创建一个 .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.
最佳答案
失败的不是 AssignFile()
,而是您对设置了 Hidden
属性的文件调用 Rewrite()
失败。下面解释一下:
通常,您会调用 Rewrite(F)
来删除文件并使用后续的 Write(F, ...)
或 向其中写入新数据WriteLn(F, ...)
调用。
来自文档(System.Rewrite):
If an external file with the same name already exists, it is deleted and a new empty file is created in its place.
使用 Append()
命令打开文件进行写入没有问题。
(根据上述内容,我得出的结论是,删除失败,并出现拒绝访问消息。这太偷工减料了。)
<小时/>由于评论的影响,我跟踪了代码并将实际代码与 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);
If CREATE_ALWAYS and FILE_ATTRIBUTE_NORMAL are specified, CreateFile fails and sets the last error to ERROR_ACCESS_DENIED if the file exists and has the FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM attribute.
对具有 hidden
属性的现有文件调用 Rewrite()
总是失败。
关于file - 分配文件() : File access denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413343/