使用Delphi创建一个允许任何用户写入的文件

3

这可能是一个愚蠢的问题,但是我似乎无法创建一个所有用户都可以写入的文本文件,它们总是由当前登录的用户拥有。

有什么想法吗? 我应该使用TextFile还是TFileStream?

4个回答

6

我认为OP想知道在哪里创建所有用户都可以写入的文件。如果是这样,Windows的理念规定这样的文件应该创建在由SHGetFolderPath(CSIDL_COMMON_DOCUMENTS)返回的目录中,或者可能是CSIDL_COMMON_APPDATA。


3
如果您创建一个文件,它将简单地继承其父容器的权限,换句话说,就是它所在的文件夹。因此,您只需要在具有必要权限的文件夹中创建它即可。

1
жҲ–иҖ…дҪҝз”ЁWin32 APIзҡ„SetFileSecurity()еҮҪж•°еңЁж–Ү件дёҠи®ҫзҪ®иҫғе°‘йҷҗеҲ¶зҡ„жқғйҷҗгҖӮ - Remy Lebeau
2
当然,你可以这样做,但最后会导致 ACL 权限控制列表的混乱,迅速变得难以管理。而且,在任何情况下,除非你拥有足够的权限,否则这种方法都不起作用,这是基本问题。 - David Heffernan
2
看起来你正在尝试写入 C:\ProgramData,这是一个受限制的权限文件夹。普通用户对该文件夹的默认权限为读取和执行、列出文件夹内容、读取。这实际上是问题的关键所在。你需要找到一个更合适的位置来定位你的文件。 - David Heffernan
大卫 - 你是正确的 - 目录是在没有'写入'权限的情况下创建的。 - mmmm

1

“在一台机器上可被所有用户写入”是什么意思?

你的意思是一个用户创建了一个文件,然后另一个用户尝试写入该文件,但失败了吗?

还是你的意思是一个用户创建了一个文件,而其他同时连接到同一台机器(通过终端会话)的用户在第一个用户写入文件时无法写入该文件?

如果是第一种情况,那么文件保存在哪里?它是否在所有用户都具有写入权限的文件夹中?

如果是第二种情况,您可以打开文件进行读/写操作而不锁定它:

var
  Stream : TFileStream;
begin
  Stream := TFileStream.Create('D:\MyFile',fmOpenReadWrite + fmShareDenyNone);
  try

  finally
    Stream.Free;
  end;
end;

请注意,使用此代码时,多个用户可能会互相覆盖!

这是第一个情况,文件被创建在c:\ProgramData中。我正在查看的代码使用“旧式”Pascal文件访问方式,我想将其全部更改为使用TFileStream,因为我知道它可以正常工作。 - mmmm
你的意思是 Stream := TFileStream.Create('D:\MyFile',fmOpenReadWrite or fmShareDenyNone); 对吧?!:-P - user497849
@Dorin:+ 运算符具有按位 OR 运算符相同的效果。 - vcldeveloper
是的,但OR运算符更加简洁--这就是Pascal语言的全部意义 :-P - user497849

1

你是在谈论文件的NTFS权限吗?如果是,你需要查找Delphi封装的NT安全API,并使用该API更改文件安全设置以允许Everyone组访问该文件。如果你只是在谈论文件在打开时的共享访问,那么vcldeveloper已经给出了答案。


Delphi封装NT安全API:听起来就像Jedi Windows安全库,也称为Jwscl:D - Remko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接