【问题标题】:Setting the current directory of a running app in C++在 C++ 中设置正在运行的应用程序的当前目录
【发布时间】:2012-08-28 13:44:15
【问题描述】:

下面的answer 给出了一个使用 C# 的解决方案,我想知道如果只使用 c++(而不是 c++\cli)会是什么等价物

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

在 boost 中有什么可以解决问题的吗?

基于我一直遇到的这个问题:Correctly creating and running a win32 service with file I/O

【问题讨论】:

  • 您想要一个 C 运行时 API 吗?或用于此的 Windows API? CRT = _chdir(),WinAPI = SetCurrentDirectory()。
  • @CraigNelson:我认为 eq- 的答案很好。我现在只需要 System.AppDomain.CurrentDomain.BaseDirectory
  • 我同意(并相应地提出了他的反馈)。

标签: c++ c winapi native


【解决方案1】:

SetCurrentDirectory(在 Win32 中):

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365530%28v=vs.85%29.aspx

current_path in boost::filesystem:

http://www.boost.org/doc/libs/1_51_0/libs/filesystem/doc/reference.html#current_path

BaseDirectory 的等价物可能是GetModuleFileName(第一个参数的句柄为空),后跟GetFullPathName 以从可执行路径获取目录。

【讨论】:

  • 很好的答案!但是“System.AppDomain.CurrentDomain.BaseDirectory”调用是否有等价物?我相信这是运行 exe 的路径
  • 另外,POSIX API:#include <unistd.h> chdir(const char*),应该可以在 Linux、Mac、BSD 上运行……我听说 Windows 也实现了一些 POSIX 调用。一些 WinApi 专家可以说点什么吗?
  • 嗯...我相信@Anon ymous 回答了我的问题。
  • 关于文件名的完整路径,Windows 中最被滥用的 API 之一:GetModuleFileName(),可能会得到你想要的。我对 boost 不熟悉(而且我认为我是现代最后一位不熟悉的 C++ 工程师),但我确信其中有一个属性或 API 可以做到这一点。
【解决方案2】:

使用SetCurrentDirectoryWINAPI。

What is the difference between _chdir and SetCurrentDirectory in windows?还有一个答案

也许还需要模块名称(似乎来自 cmets),这是我旧商店的一个:-

int main()
{
  char path[MAX_PATH]={0};
  GetModuleFileName(0,path,MAX_PATH);
}

【讨论】:

    【解决方案3】:

    在 Windows 中,完全等同于

    System.IO.Directory.SetCurrentDirectory ( System.AppDomain.CurrentDomain.BaseDirectory )` 
    

    应该是:

    // Get full executable path
    char buffer[MAX_PATH];
    GetModuleFileName(NULL, buffer, MAX_PATH);
    
    // Get executable directory
    boost::filesystem::path path(buffer);
    path = path.parent_path();
    
    // Set current path to that directory
    boost::filesystem::current_path( path );
    

    请注意,没有平台无关的方式来获取应用程序的目录,因为 C++ 不识别标准中的目录概念。 Boost 似乎也没有等效的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多