AssignFile():文件访问被拒绝

时间:2017-09-25 20:05:51

标签: file delphi

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

1 个答案:

答案 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);

documentation

  

如果指定了CREATE_ALWAYS和FILE_ATTRIBUTE_NORMAL,则为CreateFile   如果文件失败并将最后一个错误设置为ERROR_ACCESS_DENIED   存在且具有FILE_ATTRIBUTE_HIDDEN或FILE_ATTRIBUTE_SYSTEM   属性。

使用Rewrite()属性在现有文件上调用hidden会失败。