【问题标题】:why to I get this error: System.UnauthorizedAccessException: 'C:\Windows\system32\CSV_file'为什么我会收到此错误: System.UnauthorizedAccessException: 'C:\Windows\system32\CSV_file'
【发布时间】:2020-03-22 11:29:03
【问题描述】:

我用 C# 编写了一个代码。 该代码正在登录到以下文件:

  1. CPU 使用率
  2. 内存使用情况
  3. 网卡流量
  4. 当前时间

我希望在系统启动时自动执行代码。 所以我写了一个批处理文件,像这样运行 .exe 文件:

START 'C:\Debug\DiagnisticTool.exe'

而 DiagnisticTool.exe 是应用程序,它包含在 C 盘名为“Debug”的文件夹中。 批处理文件位于 windows 启动文件夹中。

当我启动我的电脑时,批处理文件正在运行,然后出现上述错误。 这是脚本代码中文件的编写方式:

using (StreamWriter outputFile = File.AppendText("PerformanceLogFile.csv"))
                {
                    outputFile.WriteLine(something to write to file);
                }

但错误表明它试图在其他地方编写它:'C:\Windows\system32'。

为什么会这样?

当我通过 Visual Studio 或它创建的 .exe 应用程序运行程序时,它运行正常。 另外,当我手动运行批处理文件时,它工作正常。 唯一的问题是它在启动时没有按应有的方式运行。

【问题讨论】:

  • 指定该文件的完整路径,而不仅仅是其名称。 CurrentDirectory 将会改变。
  • Windows 和cmd.exe 不将单引号视为特殊字符;您可以在文件名中使用它们。所以在这种情况下,您应该使用START C:\Debug\DiagnisticTool.exe 或更好的START "" "C:\Debug\DiagnisticTool.exe"(空的双引号可以用您选择的标题填充)
  • 如果您需要可执行文件以特定目录作为当前目录运行,该目录与当前定义的目录不同,您必须首先使用CD /D "C:\Debug"PushD "C:\Debug" 更改该目录或使用Start/D 选项Start /D "C:\Debug" "C:\Debug\DiagnisticTool.exe" 定义它。要了解每个命令的工作原理,您可以打开命令提示符窗口并输入 start /?cd /?pushd /? 等。从上面可以看出,最好的做法是双引号文件名,无论是相对的还是绝对的。
  • 此外,您应该添加到启动目录的唯一文件应该是快捷方式。在这种情况下,您应该为批处理文件添加快捷方式,而不是批处理文件本身。因此值得注意的是,对于您在问题中暗示的任务,您根本不需要批处理文件,您只需在启动目录中放置C:\Debug\DiagnisticTool.exe 的快捷方式即可。在该快捷方式的属性中,如有必要,您可以包含任何其他选项/参数,以及“开始于”目录。
  • 除上述之外,我的建议是在 C# 代码本身中使用输出/附加文件的完整路径,然后在启动目录中放置该 C# 的快捷方式,as在我之前的评论中建议。最后,您知道您命名的可执行文件拼写错误,它应该是 Diagnostic 而不是 Diagnistic

标签: c# batch-file startup unauthorizedaccessexcepti system32


【解决方案1】:

发生这种情况是因为当批处理调用您的程序时,当前文件夹不是您拥有可执行文件的文件夹,并且 Windows 不关心将当前目录更改为您的文件夹。唯一重要的是您的程序的可用性,这是因为您提供了 START 命令的完整路径。

您可以通过更改 START 命令并指定程序运行的文件夹来解决问题

START /D C:\Debug C:\Debug\DiagnisticTool.exe

或在运行文件之前添加一个 CD 命令

CD C:\DEBUG
START C:\DEBUG\DiagnosticTool.exe

或更改传递给 StreamWriter 的路径

using (StreamWriter outputFile = File.AppendText(@"C:\debug\PerformanceLogFile.csv"))

这最后一个选项虽然允许您的批次保持原样,但如果您想自定义输出文件夹,可能会出现问题。例如,如果您不允许在目标计算机上创建 C:\DEBUG 文件夹或出于其他原因。

【讨论】:

  • 我已按照您的建议进行了更改:'START /D C:\Debug 'C:\Debug\DiagnisticTool.exe 但它不起作用。 CMD 窗口启动并立即关闭@Steve
  • 不确定您的程序在开始时在做什么。尝试使用此命令行来查看控制台上是否有一些错误消息。 开始 /D C:\DEBUG cmd.exe /K C:\DEBUG\DiagnosticTools.exe
  • 你的意思是写到批处理文件中?
  • 是的,它应该打开第二个控制台并在工具退出后保持打开状态
  • 实际上你的第二个建议确实奏效了:CD C:\DEBUG START C:\DEBUG\DiagnosticTool.exe。但是为什么需要更改 CMD 目录呢?
猜你喜欢
  • 2018-06-22
  • 2016-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多