【问题标题】:C manipulate directories : how to position at a directory by giving its name in main argumentsC 操作目录:如何通过在主要参数中给出目录名称来定位目录
【发布时间】:2016-01-24 10:04:49
【问题描述】:

我无法在 C 中操作目录。

  1. 我想将 2 个目录的名称作为 main 的参数
  2. 检查第一个目录是否存在(在当前路径中)
  3. 打开目录
  4. 调用一个函数(我创建的)来创建文件并在里面做一些事情 目录
  5. 关闭目录并进入第二个目录并执行相同操作。

我写了我的代码,但它仍然没有做我在 main 上提供的目录中的东西,而是看起来我总是定位在当前目录中,所以打开目录的调用不是很好???

这是我所做的:

 int main(int argc, char *argv[])
    {
       int i = 0;
       char cwd[1024];
       if(argc < 3)
       {
            printf("Erreur dans les arguments\n");
       } else 
       {
          for(i = 1; i < argc; i++)
          {
            if (getcwd(cwd, sizeof(cwd)) == NULL)
            {
                printf("an error occured when getting current directory\n");
            }
            // make a path to the directory
            strcat(cwd, "/");
            strcat(cwd, argv[i]);
            strcat(cwd, "/");
            printf("cwd %s\n", cwd);
            //check if directory exist and readable
            //if((rep = opendir(argv[i])) != NULL) not working also
            if((rep = opendir(cwd)) != NULL)
            {
               getcwd(cwd, sizeof(cwd));
               printf("cwd %s\n", cwd);

              // do some stuff on the directory 

              //int result = createFile("file.txt"); // this function works fine but the file is always created in the current directory
            }
        }
     }
   }

如果有人可以提供帮助,我们将不胜感激。谢谢你。

【问题讨论】:

  • @chux 此代码中没有可见声明。
  • @chux 和ameyCU 对不起,这是我制作的一个大程序的一部分,我不想把所有的程序都放在这里,这就是为什么我忘记了圆珠笔,我是真对不起。我编辑了问题。
  • 您只需调用getcwd() 一次,除非您使用chdir() 更改目录。您不需要为 getcwd() 的值添加前缀;您可以使用. 来表示当前目录。或者您可以简单地使用未更改的名称;用户可以选择输入绝对名称(以/ 开头)或相对名称(不以/ 开头)。这提供了最佳的灵活性。
  • @JonathanLeffler 我想要的只是进入我在 argv 中指定的目录(它必须存在于当前目录中)并在那里做我的事情,而不是关闭它并对下一个 argv 做同样的事情...但我做不到,我正在尝试但没有结果>.

标签: c directory argv opendir


【解决方案1】:

这是一些工作代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>

int main(int argc, char **argv)
{
    int i = 0;
    char path[1024];

    if (argc < 3)
    {
        fprintf(stderr, "Usage: %s dir1 dir2 [...]\n", argv[0]);
        exit(1);
    }

    for (i = 1; i < argc; i++)
    {
        DIR *rep;
        if ((rep = opendir(argv[i])) != NULL)
        {
            struct dirent *dp;
            while ((dp = readdir(rep)) != 0)
            {
                if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
                    continue;
                printf("Name: %s/%s\n", argv[i], dp->d_name);
            }
            closedir(rep);

            snprintf(path, sizeof(path), "%s/%s", argv[i], "filename.txt");
            FILE *fp = fopen(path, "w");

            if (fp == 0)
                fprintf(stderr, "Failed to create file %s\n", path);
            else
            {
                fprintf(fp, "File %s created successfully\n", path);
                fclose(fp);
            }
        }
    }
    return 0;
}

示例运行:

$ mkdir junk1 junk1/subdir junk2 junk2/subdir-too
$ cp /dev/null junk1/forget-me-not
$ cp /dev/null junk2/hallelujah-chorus
$ ./dodir junk1 junk2
Name: junk1/forget-me-not
Name: junk1/subdir
Name: junk2/hallelujah-chorus
Name: junk2/subdir-too
$ ls -l junk?
junk1:
total 8
-rw-r--r--  1 jleffler  staff  45 Oct 25 00:11 filename.txt
-rw-r--r--  1 jleffler  staff   0 Oct 25 00:11 forget-me-not
drwxr-xr-x  2 jleffler  staff  68 Oct 25 00:11 subdir

junk2:
total 8
-rw-r--r--  1 jleffler  staff  45 Oct 25 00:11 filename.txt
-rw-r--r--  1 jleffler  staff   0 Oct 25 00:11 hallelujah-chorus
drwxr-xr-x  2 jleffler  staff  68 Oct 25 00:11 subdir-too
$ rm -fr junk?
$

【讨论】:

  • so of i resume : opendir(argv[i]) 打开具有给定名称的目录, readdir(rep) 读取目录中的内容,您可以获得该目录的路径而不是创建的文件..等等。现在有没有办法调用这个函数(我将在下面列出),它将任何字符串作为参数并在目录 argv[i] 中执行它,我不知道如何给它一个路径或定位在 argv[i ] 不使用路径: int createFolder(char *target) { char buffer[100] = {0}; snprintf(缓冲区,sizeof(缓冲区),“mkdir %s”,目标);返回(系统(缓冲区)); }
  • 你如何缩进注释中的代码??因为我的看起来很可怕...>.
  • 我展示了如何在目录中创建文件;您可以在函数中而不是在主程序中执行此操作。使用system()mkdir 命令很笨拙;请改用mkdir() 系统调用。您必须至少将 argv[i] 以及可能的子目录名称传递给您的 createFolder() 函数,仅此而已。
  • 您将代码括在反引号 (`…`) 中以使其看起来像代码。不过,在评论中出现反引号更难。为此,我使用了(``(`…`)``)(括号可能有助于让反引号出现)。和不;递归可以停在那里。在 Markdown 中记录 Markdown 真的很可怕。
  • 天哪,我可以将整个路径传递给我的函数!对,我需要修改我的函数 createfolder() ..omg 这是我认为的线索,我希望它会起作用,我今天不睡觉 xD
【解决方案2】:

opendir 不会更改当前工作目录。它打开 建立一个目录并为您提供一个句柄。

您需要调用chdir 来实际更改当前工作目录。

【讨论】:

  • 谢谢你回答我,所以如果我这样做 int cpt = chdir(cwd);我会自动定位到目录,然后调用函数来创建文件?
  • @Potato:你可以使用chdir(),但使用时要小心。如果这样做,处理第二个目录名称将更加困难(查找fchdir() 以及如何打开目录以便您可以使用fchdir())。没有chdir(),您可能也可以完成您的工作;只需将您获得的目录名称添加到您需要使用的任何名称的前面。请注意,readdir() 中的名称将仅包含与您正在读取的目录相关的名称;除非您使用chdir(),否则您需要在名称前加上目录名称,但如果可能,我会避免使用chdir()
  • @JonathanLeffler,谢谢你的回答:),但我仍然无法修复它,我不确定你是否明白我想要做什么。请告诉我: if((rep = opendir(argv[i])) != NULL) 是否意味着我位于目录 argv[i] 中?如果目录打开了为什么我不能在那里做我的事情?
  • @Potato:opendir(argv[i])chdir(argv[i]) 之间存在巨大差异。第一个允许您从目录中读取文件的名称,无论它是否是进程的当前目录。第二个更改了诸如./subdir/filenamefilename 之类的相对名称的含义,但不更改诸如/path/to/subdir/filename 之类的绝对名称的含义。无论您的进程是否将其作为当前目录,您都可以在目录中执行操作。但是,您引用文件的方式取决于您是否完成了chdir()chdir() 的问题又回来了。
  • @JonathanLeffler 从你所说的我认为我不需要使用 chdir() 来解决我的问题,我真的不需要更改路径。但是我虽然当我们想在一个目录中做某事时,我们只需要确保它存在正确吗?像这样:if((rep = opendir(argv[i])) != NULL) { createfile()},然后文件将在 argv[i] 中创建,我过了 3 个小时,我想不通,这应该很容易,但没有。
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 2020-01-31
相关资源
最近更新 更多