这是代码(针对整个项目)
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,因为文件永远不会写入也不会打开)
答案 0 :(得分:1)
我会更改这一行:
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());
}
}