【问题标题】:Directory.GetCurrentDirectory() returns different results based on command line argumentsDirectory.GetCurrentDirectory() 根据命令行参数返回不同的结果
【发布时间】:2014-07-07 05:07:39
【问题描述】:

我希望有人能解释为什么 Directory.GetCurrentDirectory() 根据我将命令行参数传递给应用程序的方式(使用 args 运行与在应用程序上拖动文件夹)返回不同的结果。 exe)

要直接进入它,请考虑以下代码:

 public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("The current directory is {0}", Directory.GetCurrentDirectory());

        if(args != null && args.Any())
            Console.WriteLine("Command line arguments are {0}", String.Join(", ", args));

        Console.ReadLine();
    }
}


如果您使用如下所示的命令提示符构建并运行它,输出就是您所期望的。它将输出应用程序所在的当前目录。

C:\Projects\ArgumentTest\ApplicationA\bin\Debug\ApplicationA.exe C:\mydirectory
The current directory is C:\Projects\ArgumentTest\ApplicationA\bin\Debug\
Command line arguments are C:\mydirectory


如果您通过在应用程序上拖动文件或文件夹来构建和运行该程序,您会得到不同的结果。 Directory.GetCurrentDirectory() 不是返回预期结果,而是返回您在应用程序上拖动的第一个文件的路径。


我目前已经解决了这个问题,但是我很想知道为什么会发生这种情况。

其他信息:

  • .NET 4.5
  • Windows 2012R2(虚拟机)
  • 机器上的完全管理员权限

希望有人能提供一些见解。

【问题讨论】:

    标签: c# .net .net-4.5 command-line-arguments


    【解决方案1】:

    我敢打赌,问题在于“当前目录”属性不同。

    当前目录为您提供当前工作目录,而不是可执行文件所在的位置。

    拖放时当前目录设置为源(拖动源)而不是放置目标

    【讨论】:

      【解决方案2】:

      当您将文件拖放到可执行文件上时,它会从您拖放文件的位置运行它。例如,如果您将 C:\Path-To-File\File.txt 放到 C:\Program\ApplicationA.exe 上,就好像您在命令提示符下完成了以下操作:

      cd C:\Path-To-File
      C:\Program\ApplicationA.exe C:\Path-To-File\File.txt
      

      当您手动运行应用程序时(在上面的示例中),您可以控制运行它的目录,这就是它与您期望的匹配的原因。

      【讨论】:

        【解决方案3】:

        我认为这里的问题是您的期望。特别是这一点:

        它将输出应用程序所在的当前目录。

        不是我对@9​​87654321@ 的期望。当前目录是调用上下文的特征,而不是应用程序。如果我通过完整路径或相对路径(而不仅仅是foo.exe)运行可执行文件,我希望GetCurrentDirectory() 返回我所在的目录,而不是应用程序所在的目录。在拖拽文件的情况下:坦白说GetCurrentDirectory()很大程度上是未定义的,但第一个文件的目录也不是不合理。

        【讨论】:

        • +1。可能有用的是添加,如果所需的行为是获取 EXE 的包含文件夹,提及使用 Process.GetCurrentProcess().MainModule.FileName 或 Assembly.GetExecutingAssembly().Location 获取该信息可能很有用。
        • 谢谢马克。我想我没有完全理解 GetDirectory(),因为我从来没有真正从我正在运行的应用程序之外调用过。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        相关资源
        最近更新 更多