所以,基本上,我有一个程序可以分离子进程并创建一个名为+子进程ID的目录。这是在代码的另一部分完成的。
因此,假设用户将目录命名为“TestDir#”。最终将是TestDir12342或类似的东西。
因此,稍后,用户可以通过键入TestDir#输入该目录的搜索词。我想删掉“#”,并让chdir()搜索以该名称开头的目录“TestDir”。我不必担心该程序的重复文件或类似命名的文件。
有没有人知道用chdir()做一个简单的方法?我尝试了很多不同的测试代码,但我输了。
我还尝试将子进程ID存储在父进程中,但由于某种原因,我永远无法让它们匹配。我知道fork()给出了子进程ID以返回父进程。然而,出于某种原因,该计划拒绝让它们匹配。
所以,我正在尝试将其作为一种解决方法(搜索文件名的开头部分)。如果有人知道如何做到这一点,感谢您的帮助。
答案 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”的子目录的目录中执行。