C# 应用程序是否需要对父文件夹的写入权限?

C# 应用程序是否需要对父文件夹的写入权限?,c#,.net,C#,.net,当我试图在当前用户没有写入权限的文件夹中运行应用程序时,应用程序崩溃 所以我的问题是,.net应用程序是否默认在父文件夹中创建临时文件 如果是,我们可以显式设置一个路径来设置一个外部文件夹,在这个文件夹中应用程序有写权限来创建临时文件吗 谢谢 编辑:我带着更多的细节回来了。。。 因此,异常是System.UnauthorizedAccessException,它尝试创建的文件名为“l1m5tzj4.tmp” 所以我现在确定.NET应用程序正在尝试在当前文件夹中创建一个临时文件 这是stacktr

当我试图在当前用户没有写入权限的文件夹中运行应用程序时,应用程序崩溃

所以我的问题是,.net应用程序是否默认在父文件夹中创建临时文件

如果是,我们可以显式设置一个路径来设置一个外部文件夹,在这个文件夹中应用程序有写权限来创建临时文件吗

谢谢

编辑:我带着更多的细节回来了。。。 因此,异常是System.UnauthorizedAccessException,它尝试创建的文件名为“l1m5tzj4.tmp”

所以我现在确定.NET应用程序正在尝试在当前文件夹中创建一个临时文件

这是stacktrace

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at System.CodeDom.Compiler.TempFileCollection.EnsureTempNameCreated()
   at System.CodeDom.Compiler.TempFileCollection.get_BasePath()
   at System.CodeDom.Compiler.TempFileCollection.AddExtension(String fileExtension, Boolean keepFile)
   at System.CodeDom.Compiler.TempFileCollection.AddExtension(String fileExtension)
   at System.Configuration.Internal.WriteFileContext..ctor(String filename, String templateFilename)
   at System.Configuration.Internal.InternalConfigHost.StaticOpenStreamForWrite(String streamName, String templateStreamName, Object& writeContext, Boolean assertPermissions)
   at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.OpenStreamForWrite(String streamName, String templateStreamName, Object& writeContext, Boolean assertPermissions)
   at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.OpenStreamForWrite(String streamName, String templateStreamName, Object& writeContext)
   at System.Configuration.ClientConfigurationHost.OpenStreamForWrite(String streamName, String templateStreamName, Object& writeContext)
   at System.Configuration.UpdateConfigHost.OpenStreamForWrite(String streamName, String templateStreamName, Object& writeContext)
   at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
编辑2:所以它看起来像是在我将一个新值放入exe配置文件时发生的

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (configuration.AppSettings.Settings[key] != null)
{
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save();
    ConfigurationManager.RefreshSection("appSettings");
}
那么,为什么在我试图保存配置时它会尝试创建一个临时文件呢?
当我们没有对其文件夹的写访问权限时,是否有保存配置的最佳做法?

否,.NET应用程序在运行时默认情况下不会在包含执行程序集的文件夹中创建任何(临时或其他)文件

除其他外,可以做到这一点的机制包括:

  • 追踪
  • 伐木
  • 库的人工制品,例如ODP.NET数据库提供程序
  • 动态编译,例如序列化程序
编辑到目前为止,还有其他可用信息,因此我们也可以在此处解决您的实际情况:

调用
Configuration.Save
,尝试更新filename.exe.config文件。现在您的问题是,为什么系统不只是覆盖现有的配置文件,而是创建一个临时文件

原因由一位不知名的Microsoft程序员给出,他评论道:

当前算法保证
1) 我们要保存到的文件将始终存在 在文件系统上(即没有窗口 在保存期间,其中不会有文件)
2) 它将始终可用于从 客户和它将是完整和准确的

首先,它们创建一个临时文件,在其中写入新配置。这就是当程序抛出异常时失败的情况

在此之后,它们将原始配置文件替换为临时文件(在您的情况下,执行永远不会有那么远)

当我们没有对其文件夹的写访问权限时,是否有保存配置的最佳做法

您可以将配置文件重定向到您选择的任何其他文件夹:


任何应用程序如果要在该文件夹中写入任何内容,都需要写入权限。您指的是什么临时文件?如果您对父文件夹授予写入权限,您的应用程序是否工作?@HyukchanKwon请调试应用程序,并在问题中添加带有stacktrace的异常。NET程序默认情况下不会写入其自己的文件夹或父文件夹,除非您对其进行编程,否则,或者你的程序使用了一个试图做这种恶作剧的库。或者您的计算机感染了恶意软件…@HyukchanKwon此异常在我看来类似于生成时异常,而不是在调试时。更广泛地说,.Net或Windows本机应用程序根本不会在任何地方创建文件/文件夹,除非某些用户的代码这样做。最常见的情况(尚未列出)-不了解“当前工作文件夹”及其与相对文件路径的关系。对-可能除了程序集绑定(融合)日志记录之外,但这也是需要配置的,并且默认情况下从不启用。非常感谢大家:)