0

这是代码(整个项目)

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 (因为文件从未被写入或打开过)

4

1 回答 1

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可以重新组织,以便:

  1. 您打开一个目录,收集该目录的所有文件和子目录,关闭该目录,然后处理文件和子目录。这样,您就不必担心打开的目录太多。

  2. 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());
   }
}
于 2014-05-09T17:49:32.250 回答