C操纵目录:如何通过在主参数中给出其名称来定位目录

时间:2015-10-25 05:33:32

标签: c directory argv opendir

我在操作C中的目录时遇到了麻烦。

  1. 我想在主
  2. 上给出2个目录的名称作为参数
  3. 检查第一个目录是否存在(在当前路径中)
  4. 打开目录
  5. 调用一个函数(我创建的)来创建文件并在里面做东西 目录
  6. 关闭目录并进入第二个目录并执行相同操作。
  7. 我编写了我的代码,但它仍然不在我在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
                }
            }
         }
       }
    

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这是一些有效的代码:

#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?
$