Привет всем. Мне нужно написать программу 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;
}