Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# 存在检测问题_C#_.net - Fatal编程技术网

C# 存在检测问题

C# 存在检测问题,c#,.net,C#,.net,我写的一个程序有一个奇怪的问题,它的命令File.Exists()在同一目录下不总是检测到与可执行文件相同的文件 我有这样的想法: if (File.Exists("TextFile1.txt")) { //do some stuff } 但奇怪的是,如果我在cmd提示符下运行这个可执行文件,它不会检测到文件。但是如果我通过另一个进程启动这个可执行文件,它会很好地检测到文件 对这个奇怪的问题有什么想法吗? 谢谢。这是可执行文件工作目录的相

我写的一个程序有一个奇怪的问题,它的命令File.Exists()在同一目录下不总是检测到与可执行文件相同的文件

我有这样的想法:

    if (File.Exists("TextFile1.txt"))
        {
        //do some stuff
        }
但奇怪的是,如果我在cmd提示符下运行这个可执行文件,它不会检测到文件。但是如果我通过另一个进程启动这个可执行文件,它会很好地检测到文件

对这个奇怪的问题有什么想法吗?
谢谢。

这是可执行文件工作目录的相对文件路径。从命令提示符运行应用程序时,工作目录将设置为可执行文件所在的目录。当您通过另一个进程(process.Start)运行此可执行文件时,工作目录就是主机进程的工作目录。您可以在运行进程之前修改工作目录,也可以使用绝对文件路径

要记住的另一件事是,如果运行代码的帐户没有足够的文件夹权限,则可能返回false

如果调用方具有所需的权限并且路径包含 现有文件的名称;否则,错误。此方法还返回 如果路径为null、无效路径或长度为零的字符串,则为false。如果 调用方没有足够的权限读取指定的 文件,则不会引发异常,并且该方法将返回false 路径的存在性


文件路径相对于文件路径,而不是可执行文件所在的位置。您应该完全限定文件路径,或者从以下位置获取可执行文件的位置。

允许path参数指定相对路径或绝对路径 信息相对路径信息被解释为相对于 当前工作目录。获取当前工作状态 目录,请参阅GetCurrentDirectory

当你看到:

当前目录与原始目录不同,原始目录 是从中启动流程的


由于您使用的是相对路径,我有一种预感,即执行程序集的位置与您认为的不同

在您的代码中,尝试使用以下命令检查exe从何处启动:

System.IO.Path.GetDirectoryName( 
  System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );

(from)

问题很可能是不同进程之间的差异


但是,另一个问题可能是,每个进程都以不同的用户/权限运行,并且命令提示符无法访问文件所在的文件夹。

为什么不能完全限定路径?与执行相关的文件在哪里?另一个进程呢?我想这完全取决于应用程序认为当前工作文件夹是什么…这两个进程可能有不同的权限级别,一个可以访问文件夹,另一个不能。我同意@JustinSatyr。在过去,当我的服务甚至没有读取文件的权限时,这种情况就发生在我身上。事实上,根据File.Exists MSDN文档,当调用方没有读取文件的权限时,Exists方法将返回false。不一定,工作目录可以设置为其他方式。如果用户不将目录更改为可执行文件所在的目录,则可能使用路径运行可执行文件,然后他会得到他描述的问题。此外,OP应使用
Application.ExecutablePath
作为引用路径的常量。要读取的文件与可执行文件位于同一目录中,但当我从另一个进程(如进程管理器)启动可执行文件时,它将起作用。在cmd提示符中单独启动可执行文件时,它没有检测到它。@Gelion,这很奇怪。如果
TextFile1.txt
与包含您在问题中显示的代码的
Foo.exe
位于同一目录中,并且您使用命令提示符导航到包含此可执行文件的文件夹并运行Foo.exe,则应能成功找到该文件。