有没有办法将chdir()导入到只知道目录名称开头的目录中?

时间:2017-05-25 04:10:41

标签: c

所以,基本上,我有一个程序可以分离子进程并创建一个名为+子进程ID的目录。这是在代码的另一部分完成的。

因此,假设用户将目录命名为“TestDir#”。最终将是TestDir12342或类似的东西。

因此,稍后,用户可以通过键入TestDir#输入该目录的搜索词。我想删掉“#”,并让chdir()搜索以该名称开头的目录“TestDir”。我不必担心该程序的重​​复文件或类似命名的文件。

有没有人知道用chdir()做一个简单的方法?我尝试了很多不同的测试代码,但我输了。

我还尝试将子进程ID存储在父进程中,但由于某种原因,我永远无法让它们匹配。我知道fork()给出了子进程ID以返回父进程。然而,出于某种原因,该计划拒绝让它们匹配。

所以,我正在尝试将其作为一种解决方法(搜索文件名的开头部分)。如果有人知道如何做到这一点,感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

readdir可用于获取目录的条目。

以下searchFirstDir找到第一个前缀匹配的目录。 (在Ubuntu Linux中测试)

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

int searchFirstDir(const char *workingDir, const char *prefix, char *resultBuffer, int bufferLen)
{
    DIR *pDir = NULL;
    int found = 0;
    // opendir
    {
        pDir = opendir(workingDir);
        if (pDir == NULL) {
            perror("ERROR: opendir");
            return -1;
        }
    }

    // readdir
    {
        int ret;
        struct dirent *pEntry;
        struct dirent *result;
        int prefixLen = strlen(prefix);

        // refer: man readdir (in Linux)
        {
            long name_max = pathconf(workingDir, _PC_NAME_MAX);
            if (name_max == -1)         /* Limit not defined, or error */
                name_max = 255;         /* Take a guess */
            size_t len = offsetof(struct dirent, d_name) + name_max + 1;
            pEntry = malloc(len);
        }

        do {
            ret = readdir_r(pDir, pEntry, &result);
            if (ret) {
                perror("ERROR: readdir_r");
                break;
            }

            if (pEntry->d_type == DT_DIR && strncmp(pEntry->d_name, prefix, prefixLen) == 0) {
                strncpy(resultBuffer, pEntry->d_name, bufferLen);
                found++;
                break;
            }
        } while(ret == 0 && result != NULL);

        free(pEntry);
    }

    // closedir
    closedir(pDir);

    return found > 0 ? 0 : -1;
}

int main(int argc, char *argv)
{
    char resultBuffer[255];

    int ret = searchFirstDir("workingdirectory", "TestDir", resultBuffer, 255);
    if (ret == 0) {
        printf("First matched directory: %s\n", resultBuffer);
    }
}

答案 1 :(得分:1)

是的,有一种方法可以利用通配符执行请求的chdir类型,即使用通配符“*”进行文件名扩展,如下所示:

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


/* Convert a wildcard pattern into a list of blank-separated
   filenames which match the wildcard.  */

char * glob_pattern(char *wildcard)
{
  char *gfilename;
  size_t cnt, length;
  glob_t glob_results;
  char **p;

  glob(wildcard, GLOB_NOCHECK, 0, &glob_results);

  /* How much space do we need?  */
  for (p = glob_results.gl_pathv, cnt = glob_results.gl_pathc;
       cnt; p++, cnt--)
    length += strlen(*p) + 1;

  /* Allocate the space and generate the list.  */
  gfilename = (char *) calloc(length, sizeof(char));
  for (p = glob_results.gl_pathv, cnt = glob_results.gl_pathc;
       cnt; p++, cnt--)
    {
      strcat(gfilename, *p);
      if (cnt > 1)
        strcat(gfilename, " ");
    }

  globfree(&glob_results);
  return gfilename;
}

int main() {
   char *directory;
   int ret;


   directory = glob_pattern("te*");

   ret = chdir (directory);
   printf("Result of chdir: %d\n",ret);
}

注意:代码的“globbing”部分来自here

Linux有一个glob实用程序,所以如果你想在C中做同样的事情,你必须自己编写代码,就像这个例子描述的那样。程序完成后,您将返回到最初用于运行此脚本的目录中。当代码成功更改目录时,返回结果为零。注意,此代码在包含名为“test”的子目录的目录中执行。