Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序在Windows启动时启动,但可以';你不能访问文件吗?_C# - Fatal编程技术网

C# 应用程序在Windows启动时启动,但可以';你不能访问文件吗?

C# 应用程序在Windows启动时启动,但可以';你不能访问文件吗?,c#,C#,我们这里有一个我编写的C#后端应用程序。它将它的状态保存到一个txt文件中,这样当它再次启动时,它将拥有继续工作所需的详细信息。如果在用户登录(HKCU)时向注册表添加一个键以启动应用程序,则应用程序将启动,但无法读取其状态txt文件 我不知道这里发生了什么。txt文件必须与应用程序位于同一文件夹中,我按如下方式加载: String savepath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), SaveFil

我们这里有一个我编写的C#后端应用程序。它将它的状态保存到一个txt文件中,这样当它再次启动时,它将拥有继续工作所需的详细信息。如果在用户登录(HKCU)时向注册表添加一个键以启动应用程序,则应用程序将启动,但无法读取其状态txt文件

我不知道这里发生了什么。txt文件必须与应用程序位于同一文件夹中,我按如下方式加载:

String savepath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), SaveFile);
if (File.Exists(savepath)) LoadState();
我实际上是通过以下方式读取文件:

String[] lines = File.ReadAllLines(SaveFile);
这一切都不是很复杂,但因为txt文件的内容没有被加载,我假设1)file.Exists()返回为false,或者2)返回为true,而
file.ReadAllLines()返回为空


如果我关闭程序并立即重新运行它,那么它可以很好地读取文件。如果当前目录与
path.GetDirectoryName(Application.ExecutablePath)不同,那么当计算机启动时,我该如何让我的应用程序读取它的文件呢?

实际上,您没有检查也没有打开同一个文件(您传递的是
file.Exists的绝对路径和
file.ReadAllLines的相对路径)
,启动程序时就是这种情况(我想应该是
%WINDIR%\System32
,但我不确定-但是,它肯定不是您的应用程序文件夹)

应该是

String savepath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), SaveFile);
if (File.Exists(savepath)) LoadState();
    String[] lines = File.ReadAllLines(savepath);

它将第一次失败,因为手动启动和Windows启动时工作目录将不同。

尝试删除
文件.Exists()
检查(暂时)是否会返回更详细的消息。这将有助于明确诊断它失败的原因。有可能文件根本不存在——在这种情况下,您应该记录它正在查找的完整路径,因为它可能不是您所期望的。如果进程以不同的身份启动,也可能会出现权限问题。

您应该确保在执行应用程序时,它的权限与系统执行时的权限相同,否则它将无法访问该文件


此外,您可能需要检查文件是否因某种原因被锁定,并可以检查此线程:

file.Exists
如果您没有访问权限将返回false如果您无法调试它(我假设您不能,因为它发生在计算机启动期间),您可以添加MessageBox es或将应用程序中实际发生的情况写入另一个文件。有点像老式的JS调试。我认为这是真的,你是对的,也许他也应该写注册表的文件路径。这将是最简单的解决办法。
String savepath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), SaveFile);
if (File.Exists(savepath)) LoadState();
    String[] lines = File.ReadAllLines(savepath);