file - 分配文件() : File access denied

标签 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.

最佳答案

失败的不是 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);

documentation :

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/

相关文章:

c++ - 模板和 vector 错误

delphi - 如何从物理内存中读取数据?

delphi - 使用 Delphi 2006 从包含 <Class ="submit".......> 的 Web 文档中查找 IHTMLelement?

delphi - 检查 W10 上的 Windows 版本

jquery - Delphi 中的 TWebBrowser 具有 jQuery UI 框架

javascript - 使用 Electron 从文件系统中选择并显示图像

c - 读取 2kb txt 文件时出现段错误 (c)

Python:如何在单独的行上编写字符串列表但没有空行

java - 为什么在使用 ContextWraper.getDir 创建目录时出现 app_

delphi - 如何使用注释对字符串列表进行排序