我无法在argv[i]
(或/bin
)中找到/sbin
,程序包仅检查其运行目录。如何在argv[i]
和/bin
中检查/sbin
?
我目前正在使用自己的程序包管理器,正在用纯C语言编写它。我目前正在编写检查以查看是否已安装通过(使用argv[]
的)程序包。我遇到的问题是,当我运行检查时,我的代码仅检查它从中运行的目录,并且我需要它检查/bin
和/sbin
(我将处理/sbin
的检查)并且我正在尝试让它检查/bin
,但是运气为零。每次他们仅检查当前工作目录时,我似乎都无法正常工作,我需要他们检查/bin
。我无法弄清楚,以前有人偶然在纯C语言中完成此操作吗?谢谢
到目前为止,这些都是我尝试过的所有方法,但是它们都不起作用...
使用stat()
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
struct dirent *de = calloc(1, sizeof(struct dirent));
DIR *dr = opendir("/bin"); /* directory to open */
short i;
struct stat *program = calloc(1, sizeof(struct stat));
if (dr == NULL) {
printf("directory could not be opened");
return 0;
}
while ((de = readdir(dr)) != NULL) {
for (i = 1; i < argc; i++) {
if (stat(argv[i], program) == 0) {
printf("found\n");
closedir(dr);
}
else {
printf("not found\n");
closedir(dr);
}
}
}
}
使用realpath
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
struct dirent *de = calloc(1, sizeof(struct dirent));
DIR *dr = opendir("/bin"); /* directory to open */
short i;
char *res = realpath(argv[i], NULL);
if (dr == NULL) {
printf("directory could not be opened");
return 0;
}
while ((de = readdir(dr)) != NULL) {
for (i = 1; i < argc; i++) {
if (res == NULL) {
printf("found\n");
closedir(dr);
}
else {
printf("not found\n");
closedir(dr);
}
}
}
}
使用strcmp
#include <stdio.h>
#include <string.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
struct dirent *de;
DIR *dr = opendir("/bin"); /* directory to open */
short i;
struct stat program;
if (dr == NULL) {
printf("directory could not be opened");
return 0;
}
while ((de = readdir(dr)) != NULL) {
for (i = 1; i < argc; i++) {
if (strcmp(de->d_name, argv[i]) == 0) {
printf("found\n");
closedir(dr);
}
else {
printf("not found\n");
closedir(dr);
}
}
}
}
我希望他们都可以如下工作:
check echo
// it would go to /bin and find echo and then print
found
但是当我运行它们时,它们仅检查当前的工作目录,因此例如:
check connection.c
// finds connection.c in the same directory
found
解
那霸!我找到了一种方法!因此,使用功能
chdir()
可以在stat()
中运行/bin
,如下所示:#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
short i;
struct stat *program = calloc(1, sizeof(struct stat));
for (i = 1; i < argc; i++) {
chdir("/bin"); /* move to /bin */
if (chdir("/bin") != 0)
return 1;
if (stat(argv[i], program) == 0)
return 0;
else
return 1;
}
}
最佳答案
我试图简化您的代码只是为了输出文件夹的内容,每次都得到“ / bin”文件夹的内容。
作为一般经验法则,我希望在没有警告的情况下编译我的代码,对其进行测试以达到预期的效果,然后再进行下一步工作。
“结构统计程序”导致代码无法编译,我猜是您正在运行旧版本的代码。
#include <stdio.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char *argv[])
{
struct dirent *de;
DIR *dr = opendir("/bin"); /* directory to open */
short i;
// struct stat program;
if (dr == NULL) {
printf("directory could not be opened");
return 0;
}
while ((de = readdir(dr)) != NULL) {
printf(de->d_name);
printf("\n");
}
}