【问题标题】:How to change the current directory to a designated directory using chdir() in c?如何在c中使用chdir()将当前目录更改为指定目录?
【发布时间】:2020-04-25 20:33:33
【问题描述】:

编辑

存在的目录不一定是主目录的子目录。它可以是主目录的子目录的子目录。

编辑结束

我正在读取用户输入(例如,cd existsDirectory)以将当前目录更改为“existedDirectory”。我知道

chdir(getenv("HOME"));

可以将当前目录改为主目录,所以我尝试了以下方法:

chdir(getenv("/existedDirectory"));
chdir(getenv("existedDirectory"));
chdir(getenv("~/existedDirectory"));
chdir("/existedDirectory");
chdir("existedDirectory");
chdir("~/existedDirectory");

没有任何效果。任何帮助将不胜感激。

【问题讨论】:

  • 如果目录存在,您尝试的第 4 和第 5 件事将起作用。其他人没有。
  • 您首先需要了解getenv 的作用。
  • HOME 是一个环境变量,getenv("HOME") 获取它的值,它是一个代表您的主目录的字符串。 "/existedDirectory" 之类的东西已经是一个目录名称。它不是环境变量。因此,拨打getenv("/existedDirectory")是没有意义的。
  • chdir 更改执行它的进程的工作目录,并且不影响父 shell 进程。如果这不是您的问题,请显示minimal reproducible example
  • 感谢您的所有 cmets。现在我明白要使用getenv() 我需要一个完整路径,就像HOME 而不是目录的名称。 (如果我误解了这个概念,请告诉我。)不幸的是,当我使用getcwd 打印当前目录时,第 4 和第 5 不起作用。有什么想法吗?

标签: c chdir getenv


【解决方案1】:

chdir 接受一个带有要更改的路径的字符串参数。它没有其他特殊处理(环境变量或家庭或其他任何东西),所以如果你想要这些东西,你需要构建一个字符串来传递给它。

chdir("/existingDirectory");

更改到和现有目录在根目录中 -- 它有一个绝对路径。所以它必须是您在运行ls / 时看到的目录之一。

chdir("exisitingDirectory");

将更改为当前主管的现有子目录。

如果你想切换到你的主目录的子目录,你需要这样的东西:

char path[PATH_MAX];
sprintf(path, "%s/%s", getenv("HOME"), "subdir");
chdir(path);

【讨论】:

  • 感谢您的评论。实际上,代码给了我一个分段错误。你知道为什么吗?
  • 哪个代码给出了分段错误?使用调试器确定故障发生的位置。在上述代码中,唯一可能的分段错误是您的环境中未定义$HOME
【解决方案2】:

chdir() 在 C 中只影响调用它的进程。你的 shell 和你的程序是两个不同的进程,它们分别运行。因此,指示工作目录的环境变量 $PWD 只会针对您的应用程序进行更改。也检查this resource

注意:chdir() 不会改变当前 shell 的工作目录。因为当程序在shell中执行时,shell遵循fork on exec机制。所以,它不会影响当前的 shell。

【讨论】:

  • 顺便说一句,检查 lurker 的评论。 getenv() 不是您需要的功能。用这种方式没有意义
  • 嘿,Chris Dodd 的解决方案并不完整,也没有抓住主要思想。 chdir("~/existingDirectory") 也可以完成这项工作
  • 感谢您的评论。当我使用getcwd 打印当前目录时,但不幸的是它不起作用。有什么想法吗?
  • 我没听懂。什么意思?
  • 感谢您的快速回复。当我输入chdir("~existingDirectory");printf("%s\n", getcwd(cd, 100)); 以打印出当前目录时,我可以看到原始路径而不是更改后的路径。我在想也许printf("%s\n", getcwd(cd, 100)); 是错的,但我不知道为什么。
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2011-12-13
  • 2012-10-25
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多