【发布时间】:2011-04-28 05:12:07
【问题描述】:
大家好。我需要编写一个 POSIX 程序来在整个文件系统中搜索从顶层目录开始的指定文件。我有一些根本没有完成的代码,但是当我运行它并检查特定文件是否是目录时,它说这个根本不是目录的文件是一个目录并且正在尝试移入其中,导致错误。我不知道我怎么能告诉它这种类型的文件不是目录。
这是我的代码。我知道这并不完美,我可能会在获取目录名称并将它们传递给函数的方式上做一些不同的事情。无论哪种方式,我很确定我必须递归地执行此操作。
有问题的文件是 /dev/dri/card0,我从 Debian 虚拟机运行它。
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <time.h>
#include <stdint.h>
#include <locale.h>
#include <langinfo.h>
#include <fcntl.h>
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
void SearchDirectory(string file_Name, string directory){
string new_Directory = directory;
DIR *dirp;
dirp = opendir(directory.c_str());
struct dirent *dptr;
struct stat statStruct;
while(dptr = readdir(dirp)){
stat(dptr->d_name, &statStruct);
if( S_ISDIR(statStruct.st_mode) ){
string check = dptr->d_name;
if ( check.compare(".") == 0 || check.compare("..") == 0 ){
continue;
}
else{
cout << dptr->d_name << " is is a directory" << endl;
new_Directory.append("/");
new_Directory.append(dptr->d_name);
SearchDirectory(file_Name, new_Directory);
}
}
else if( S_ISREG(statStruct.st_mode)){
string check = dptr->d_name;
if( check.compare(file_Name) == 0){
cout << "Found " << file_Name << " in " << directory << "/" << endl;
}
}
}
}
int main(int argc, char *argv[]){
if(argc < 2 || argc > 2){
cerr << "This program will find the specified file." << endl;
cerr << "Usage: mysearch <filename>" << endl;
return 1;
}
string file_Name = argv[1];
SearchDirectory(file_Name, "/");
return 0;
}
【问题讨论】:
-
另外,nftw,虽然这是 XSI 而不是 POSIX 基础。
-
@ikegami -- 我不认为他在寻找 card0。我认为他的意思是 /dev/dri/card0 的 S_ISDIR 是真的,但是 opendir("/dev/dri/card0") 失败了。