当前位置:  开发笔记 > 编程语言 > 正文

用C++更改当前工作目录

如何解决《用C++更改当前工作目录》经验,为你挑选了6个好方法。

如何以平台无关的方式在C++中更改当前的工作目录?

我找到了与direct.hWindows兼容的头文件,以及与unistd.hUNIX/POSIX兼容的头文件.



1> AndiDog..:

chdir函数适用于POSIX(手册页)和Windows(_chdir在那里调用但chdir存在别名).

两个实现在成功时返回零,在出错时返回-1.正如您在联机帮助页中所看到的,POSIX变体中可能存在更多不同的errno值,但对于大多数用例而言,这不应该有所不同.


那么我会使用什么标题呢?unistd?
@sparkFinder:您可以使用`#ifdef _MSC_VER`检查Visual Studio,然后包含direct.h头文件.如果没有定义,请使用unistd.h.这应该足够了,因为Windows上的其他主要编程环境MinGW具有unistd头.
Windows上的`chdir`已弃用.

2> pepper_chico..:

对于C++,boost :: filesystem :: current_path(setter和getter prototypes).

基于Boost.Filesystem的文件系统库将添加到标准中.



3> Jeremy Fries..:

chdir()想做什么?它适用于POSIX和Windows.



4> Phil..:

这个跨平台示例代码,用于在此答案中推荐使用POSIX chdir和MS 更改工作目录.同样地,用于确定当前工作目录,类似的和被使用._chdirgetcwd_getcwd

这些平台差异隐藏在宏cd和后面cwd.

按照文档,chdir的签名是int chdir(const char *path) 其中path是绝对或相对的.chdir成功后将返回0.getcwd稍微复杂一点,因为它需要(在一个变体中)缓冲区来存储所获取的路径,如图所示char *getcwd(char *buf, size_t size).它在失败时返回NULL,并在成功时返回指向同一传递缓冲区的指针.代码示例直接使用此返回的char指针.

该示例基于@ MarcD,但更正了内存泄漏.此外,我努力简洁,没有依赖,只有基本的失败/错误检查,以及确保它在多个(通用)平台上工作.

我在OSX 10.11.6,Centos7和Win10上测试过它.对于OSX和Centos,我曾经g++ changedir.cpp -o changedir构建并运行为./changedir .

在Win10上,我用cl.exe changedir.cpp /EHsc /nologo.

MVP解决方案

$ cat changedir.cpp

#ifdef _WIN32
#include 
// MSDN recommends against using getcwd & chdir names
#define cwd _getcwd
#define cd _chdir
#else
#include "unistd.h"
#define cwd getcwd
#define cd chdir
#endif

#include 

char buf[4096]; // never know how much is needed

int main(int argc , char** argv) {

  if (argc > 1) {
    std::cout  << "CWD: " << cwd(buf, sizeof buf) << std::endl;

    // Change working directory and test for success
    if (0 == cd(argv[1])) {
      std::cout << "CWD changed to: " << cwd(buf, sizeof buf) << std::endl;
    }
  } else {
    std::cout << "No directory provided" << std::endl;
  }

  return 0;
}

OSX清单:

$ g ++ changedir.c -o changedir
$ ./changedir testing
CWD:/ Users/Phil
CWD更改为:/ Users/Phil/testing

Centos上市:

$ g ++ changedir.c -o changedir
$ ./changedir
没有提供目录
$ ./changedir does_not_exist
CWD:/ home/phil
$ ./changedir音乐
CWD:/ home/phil
CWD改为:/ home/phil/Music
$ ./ changedir/
CWD:/ home/phil
CWD改为:/

Win10上市

cl.exe changedir.cpp/EHsc/nologo
changedir.cpp

c:\ Users\Phil> changedir.exe test
CWD:c:\ Users\Phil
CWD更改为:c:\ Users\Phil\test

注意:OSX使用后面的clangCentos gnu .gccg++



5> Carl Norum..:

你想要的chdir(2).如果您尝试让程序更改shell的工作目录 - 则不能.SO上有很多答案已经解决了这个问题.



6> Gilles 'SO- ..:

你的意思是C还是C++?它们是完全不同的语言.

在C中,定义语言的标准不包括目录.许多支持目录的平台都有一个chdirchar*const char*参数的函数,但即使它存在,它所声明的标题也不是标准的.关于参数意味着什么(例如Windows具有每个驱动器目录),也可能存在细微之处.

在C++中,谷歌搜索导致chdir_chdir,并建议Boost没有chdir的接口.但我不会再评论,因为我不懂C++.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有