Вот код (для всего проекта)
File: directoryReader.cpp
//
// directoryReader.cpp
// appBetaServer
//
// Created by Ethan Laur on 3/21/14.
// Copyright (c) 2014 Ethan Laur. All rights reserved.
//
#include "directoryReader.h"#include <stdlib.h>
#include <syslog.h>
#include <string.h>
#include <stdio.h>
directoryReader::directoryReader()
{
dir = NULL;
syslog(LOG_NOTICE, "directoryReader spawned with no args!");
}
directoryReader::directoryReader(char *d)
{
dir = NULL;
setFileMode(S_IFREG);
setDirectory(d);
}
directoryReader::directoryReader(char *d, mode_t m)
{
dir = NULL;
setFileMode(m);
setDirectory(d);
}
void directoryReader::setDirectory(char * newDir)
{
strcpy(dirName, newDir);
if (dir != NULL) closedir(dir);
dir = NULL;
reset();
}
void directoryReader::setFileMode(mode_t mode)
{
fileMode = mode;
}
void directoryReader::reset()
{
if (dir != NULL) closedir(dir);
dir = opendir(dirName);
}
char * directoryReader::getNext()
{
struct stat st;
char buf[1024];
if (dir == NULL)
{
printf("Error opening %s! Will try again\n", dirName);
setDirectory(strdup(dirName));
if (dir == NULL)
{
printf("\tCould not! FAILED!\n");
return NULL;
}
}
while ((ent = readdir(dir)) != NULL)
{
sprintf(buf, "%s/%s", dirName, ent->d_name);
if (strstr(buf, "/.") == buf + (strlen(buf) - 1))
continue;
if (strstr(buf, "/..") == buf + (strlen(buf) - 2))
continue;
stat(buf, &st);
if (st.st_mode & fileMode)
return strdup(buf);
}
return NULL;
}
File: directoryReader.h
//
// directoryReader.h
// appBetaServer
//
// Created by Ethan Laur on 3/21/14.
// Copyright (c) 2014 Ethan Laur. All rights reserved.
//
#ifndef __appBetaServer__directoryReader__
#define __appBetaServer__directoryReader__
#include "dirent.h"#include <sys/stat.h>
class directoryReader
{
protected:
DIR *dir;
struct dirent *ent;
mode_t fileMode;
char dirName[1024];
public:
directoryReader();
directoryReader(char *);
directoryReader(char *, mode_t);
void setDirectory(char *);
void setFileMode(mode_t);
void reset();
char *getNext();
};
#endif /* defined(__appBetaServer__directoryReader__) */
File: main.cpp
//
// main.cpp
// fdup
//
// Created by Ethan Laur on 5/9/14.
// Copyright (c) 2014 Ethan Laur. All rights reserved.
//
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include "directoryReader.h"char goodpath(char *p)
{
if (*(p + strlen(p) - 1) == '.')
return 0;
return 1;
}
void p_getfiles(char *basepath, FILE *f, char *filename) //filename is to ignore
{
directoryReader *dirr = new directoryReader(basepath, S_IFREG | S_IFDIR);
char *tmppath = NULL;
struct stat st;
while ((tmppath = dirr->getNext()) != NULL)
{
if (strcmp(tmppath, filename) == 0)
continue;
if (goodpath(tmppath))
{
stat(tmppath, &st);
if (S_ISDIR(st.st_mode))
{
if (strcmp(tmppath, filename) == 0)
printf("uh oh...\n");
p_getfiles(tmppath, f, filename);
}
else if (S_ISREG(st.st_mode));
//fprintf(f, "%s\n", tmppath);
}
free(tmppath);
}
delete dirr;
}
void getfiles(char *basepath, char *filename)
{
FILE *f;// = fopen(filename, "w");
p_getfiles(basepath, f, filename);
//fflush(f);
//fclose(f);
}
int main(int argc, char * * argv)
{
getfiles(argv[1], argv[2]);
}
Проблема заключается в directoryReader :: getNext () или в p_getfiles (char *, FILE *, char *).
Что происходит, это (выход);
Error opening //.DocumentRevisions-V100/PerUID/501/83! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/84! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/85! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/86! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/87! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/88! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/89! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/8a! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/8b! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/8c! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/8d! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/8e! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/8f! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/90! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/91! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/92! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/93! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/94! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/95! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/96! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/97! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/98! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/99! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9a! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9b! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9c! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9d! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9e! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/9f! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a0! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a1! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a2! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a3! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a4! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a5! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a6! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a7! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a8! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/a9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/aa! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b0! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b1! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b2! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b3! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b5! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b6! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b8! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/b9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ba! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/bb! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/bc! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/bd! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/be! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/bf! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c1! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c2! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c3! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c4! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c5! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c6! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c7! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c8! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/c9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ca! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/cb! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/cc! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/cd! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ce! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/cf! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d0! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d1! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d2! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d3! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d4! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d5! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d6! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d7! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d8! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/d9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/da! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/db! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/dc! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/dd! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/de! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e0! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e2! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e3! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e4! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e5! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e6! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e7! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e8! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/e9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ea! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/eb! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ec! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ed! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ee! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ef! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f0! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f1! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f2! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f3! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f4! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f5! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f6! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f7! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f8! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/f9! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/fc! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/fd! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/fe! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/PerUID/501/ff! Will try again
Could not! FAILED!
Error opening //.DocumentRevisions-V100/staging! Will try again
Could not! FAILED!
Error opening //.fseventsd! Will try again
Could not! FAILED!
Error opening //.Spotlight-V100! Will try again
Could not! FAILED!
Error opening //.Trashes! Will try again
Could not! FAILED!
Error opening //.vol! Will try again
Could not! FAILED!
Error opening //Applications! Will try again
Could not! FAILED!
Error opening //bin! Will try again
Could not! FAILED!
Error opening //cores! Will try again
Could not! FAILED!
Error opening //dev! Will try again
Could not! FAILED!
Error opening //efi! Will try again
Could not! FAILED!
Error opening //etc! Will try again
Could not! FAILED!
Error opening //home! Will try again
Could not! FAILED!
Error opening //Library! Will try again
Could not! FAILED!
Error opening //net! Will try again
Could not! FAILED!
Error opening //Network! Will try again
Could not! FAILED!
Error opening //opt! Will try again
Could not! FAILED!
Error opening //private! Will try again
Could not! FAILED!
Error opening //sbin! Will try again
Could not! FAILED!
Error opening //System! Will try again
Could not! FAILED!
Error opening //tmp! Will try again
Could not! FAILED!
Error opening //Users! Will try again
Could not! FAILED!
Error opening //usr! Will try again
Could not! FAILED!
Error opening //usr0! Will try again
Could not! FAILED!
Error opening //var! Will try again
Could not! FAILED!
Error opening //Volumes! Will try again
Could not! FAILED!
Теперь я не знаю, почему это не работает, хотя я знаю, что это не из-за «//» в начале.
Если бы кто-нибудь мог помочь мне диагностировать (по крайней мере) или решить эту проблему, это было бы здорово. Если мне не хватает какой-либо информации, пожалуйста, оставьте комментарий, и я внесу изменения.
Редактировать 1: переданы аргументы / и blarg (blarg, так как файл никогда не записывается и не открывается)
Я бы изменил строку:
sprintf(buf, "%s/%s", dirName, ent->d_name);
в
if (strcmp(dirname, "/") == 0 )
{
sprintf(buf, "/%s", ent->d_name);
}
else
{
sprintf(buf, "%s/%s", dirName, ent->d_name);
}
Это изменило мои тесты.
Также,
if (strcmp(tmppath, filename) == 0)
continue;
приведет к утечке памяти. Я бы изменил это на:
if (strcmp(tmppath, filename) == 0)
{
free(tmppath);
continue;
}
Все остальное выглядит хорошо для меня.
Обновить
Будет хорошо иметь деструктора directoryReader
это закроет открытый каталог.
directoryReader::~directoryReader()
{
if (dir != NULL) closedir(dir);
}
Также, p_getfiles
может быть реорганизован так, чтобы:
Вы открываете каталог, собираете все файлы и подкаталоги каталога, закрываете каталог, а затем обрабатываете файлы и подкаталоги. Таким образом, вам не нужно беспокоиться о слишком большом количестве открытых каталогов.
Вы можете создать набор из directoryReader
в стеке, а не в куче.
Вот немного переработанная версия p_getfiles
,
void p_getfiles_and_directories(char const* basepath,
char const* filename, //filename is to ignore
std::vector<std::string>& files,
std::vector<std::string>& directories)
{
// This function does not recurse directories.
// It just returns the file and sub-directories in the given
// basepath.
directoryReader dirr(basepath, S_IFREG | S_IFDIR);
char *tmppath = NULL;
struct stat st;
while ((tmppath = dirr.getNext()) != NULL)
{
if (strcmp(tmppath, filename) == 0)
continue;
if (goodpath(tmppath))
{
stat(tmppath, &st);
if (S_ISDIR(st.st_mode))
{
directories.push_back(tmppath);
}
else if (S_ISREG(st.st_mode))
{
files.push_back(tmppath);
}
}
free(tmppath);
}
}
void p_getfiles(char const* basepath, FILE *f, char const* filename) //filename is to ignore
{
// Get all the files and sub-directories in the given basepath.
std::vector<std::string> files;
std::vector<std::string> directories;
p_getfiles_and_directories(basepath, filename, files, directories);
// Recurse directories.
std::vector<std::string>::iterator iter = directories.begin();
std::vector<std::string>::iterator end = directories.end();
for ( ; iter != end; ++iter )
{
if (strcmp((*iter).c_str(), filename) == 0)
printf("uh oh...\n");
p_getfiles((*iter).c_str(), f, filename);
}
// Process files.
iter = files.begin();
end = files.end();
for ( ; iter != end; ++iter )
{
fprintf(stdout, "%s\n", (*iter).c_str());
}
}