如果用户没有写入权限,如何编写文件

4

你好,我有一个应用程序会创建/写入日志文件(之后会写入错误日志),但是现在遇到了权限问题,因为如果用户没有在我的应用程序所在文件夹中创建文件的权限,它就会抛出异常。

现在我的问题是,如何让这个应用程序独立(不受用户影响)地获得创建和写入文件的权限。

我看过这篇文章,但它没有帮助,因为客户端无法授予权限(他们没有授权),但我需要这个权限来运行我的应用程序。

非常感谢您的帮助。


你的错误日志文件是否与用户相关?如果不同的用户在同一台计算机上运行应用程序,您是否会有不同的日志?或者说您是否可以有不同的日志?在这种情况下,您可以将此日志创建在用户的应用数据文件夹中,所有用户都将拥有对自己的AppData文件夹的权限。 - Ravi Y
3
将程序二进制文件与数据分开是一个常见的理念(我甚至会说是一种最佳实践)。例如,所有 Windows 应用程序都位于“Program Files”下,但将其数据写入用户的“%APPDATA%”以存储个人数据或“%ProgramData%”以存储共享数据。您应该遵循这些指南。如果有任何让您产生不同想法的地方,请详细说明。 - Steve B
@SteveB 如果您将您的命令作为答案,我会将其标记为答案。 - Karl_Schuhmann
@ryadavilli,它不会包含特定于用户的数据。 - Karl_Schuhmann
我认为ProgramData文件夹(如上文Steve B所澄清的)是您情况下最好的位置。 - Ravi Y
1个回答

4

通常认为(我甚至会说是最佳实践)将程序二进制文件与其数据分离。

例如,所有的Windows应用程序都位于Program files下,但是它们会将数据写入到用户的%APPDATA%和共享数据的%ProgramData%中。除非您的程序有非常特殊的要求,否则应该遵循这些指南。

根据数据类型,特别是如果您希望用户快速找到数据,则还可以在用户文档文件夹下创建子文件夹。

使用C#,您将能够轻松地使用Environment.GetFolderPath方法查找此类特殊文件夹。例如:

public string GetDataFolder()
{
    var appDataPath = Environment.GetFolderPath(
        Environment.SpecialFolder.ApplicationData, // Search under %APPDATA%
        Environment.SpecialFolderOption.Create // Create the folder if it does not exists
    );
    var dataFolder = Path.Combine(
        appDataPath,
        "MyApplication"
    );
    return dataFolder;
}

如果您查看Environment.SpecialFolderOption枚举,您会发现大多数常见位置都很容易找到。
因为您提到数据将由所有用户共享,所以应该特别针对%ProgramData%进行定位,可以使用Environment.SpecialFolder.CommonApplicationData来找到它:

这个目录作为所有用户使用的应用程序特定数据的公共存储库。

最终,此文件夹将被解析为(默认设置)C:\Programdata\MyApplication

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