我发现了一个程序问题的bizzare问题,其中命令File.Exists()并不总是在与可执行文件相同的目录中检测到相同的文件。
我有类似的事情: if (File.Exists("TextFile1.txt"))
{
//do some stuff
}
但奇怪的是,如果我在cmd提示符下运行此可执行文件,它不会检测到该文件。但是,如果我通过另一个进程启动此可执行文件,它将检测文件正常。
关于这个bizzare问题的任何想法? 感谢。
答案 0 :(得分:13)
这是可执行文件工作目录的相对文件路径。从命令提示符运行应用程序时,工作目录将设置为可执行文件所在的目录。当您通过另一个进程(Process.Start)运行此可执行文件时,工作目录是主进程的工作目录。您可以在运行进程之前修改工作目录,也可以使用绝对文件路径。
要记住的另一件事是,如果您运行代码的帐户对该文件夹没有足够的权限,File.Exists可能会返回false。
如果调用者具有所需权限且路径包含,则为true 现有文件的名称;否则,错误。此方法也会返回 如果path为null,无效路径或零长度字符串,则返回false。如果 调用者没有足够的权限来读取指定的 文件,没有抛出异常,方法返回false,无论如何 路径的存在。
答案 1 :(得分:3)
文件路径相对于CurrentDirectory而不是可执行文件所在的位置。您应该完全限定文件路径,或获取可执行文件的位置。
答案 2 :(得分:1)
来自MSDN:
允许path参数指定相对路径或绝对路径 信息。相对路径信息被解释为相对于 当前的工作目录。获得当前的工作 目录,请参阅GetCurrentDirectory。
当你看GetCurrentDirectory时:
当前目录与原始目录不同,后者 是进程开始的那个。
答案 3 :(得分:1)
由于您使用的是相对路径,我有一种预感,即执行程序集的位置不是您想象的那样。
在您的代码中尝试使用以下命令检查exe的启动位置:
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
答案 4 :(得分:0)
问题很可能是CurrentDirectory因进程而异。
但是,另一个问题可能是每个进程都以不同的用户/权限运行,并且命令提示符无权访问文件所在的文件夹。