我想创建一个.txt文件,并在运行时随时写入它.为此,我正在使用该AssignFile()功能.但是在我的文件已经存在的情况下我遇到了麻烦.我收到一条错误消息:文件访问被拒绝.
为了更好地解释,请参阅以下两个示例:
例1:如果我AssignFile()第一次在文件不存在时调用,OK!但是,如果文件存在,这不起作用.
例2:如果我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.
Run Code Online (Sandbox Code Playgroud)
这不是AssignFile()失败,而是你Rewrite()对具有Hidden属性集的文件的调用.以下解释:
通常,您调用Rewrite(F)以删除文件并使用后续Write(F, ...)或WriteLn(F, ...)调用将新数据写入其中.
来自docs(System.Rewrite):
如果已存在具有相同名称的外部文件,则会删除该文件并在其位置创建新的空文件.
使用该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);
Run Code Online (Sandbox Code Playgroud)
和文件:
如果指定了CREATE_ALWAYS和FILE_ATTRIBUTE_NORMAL,则CreateFile将失败并将最后一个错误设置为ERROR_ACCESS_DENIED(如果该文件存在且具有FILE_ATTRIBUTE_HIDDEN或FILE_ATTRIBUTE_SYSTEM属性).
Rewrite()使用该hidden属性调用现有文件始终失败.
| 归档时间: |
|
| 查看次数: |
1547 次 |
| 最近记录: |