AssignFile():文件访问被拒绝

2 delphi file

我想创建一个.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)

Tom*_*erg 7

这不是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属性调用现有文件始终失败.