Вопрос

Here is the code (for the whole project)

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]);
}

The issue is in directoryReader::getNext() or in p_getfiles(char *, FILE *, char *).

What happens, is this (output);

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!

Now, I don't know much about why this isn't working, though I do know it isn't because of the "//" at the beginning.

If anybody could help me diagnose (at least) or fix this problem, that would be great. If I am missing any information, please leave a comment and I will make edits.

Edit 1: Arguments passed are / and blarg (blarg since the file is never written to nor opened)

Это было полезно?

Решение

I would change the line:

      sprintf(buf, "%s/%s", dirName, ent->d_name);

to

   if (strcmp(dirname, "/") == 0 )
   {
      sprintf(buf, "/%s", ent->d_name);
   }
   else
   {
      sprintf(buf, "%s/%s", dirName, ent->d_name);
   }

That made a difference in my testing.

Also,

    if (strcmp(tmppath, filename) == 0)
    continue;

will result in a memory leak. I would change that to:

    if (strcmp(tmppath, filename) == 0)
    {
      free(tmppath);
      continue;
    }

Everything else looks good to me.

Update

It will be good to have a destructor of directoryReader that will close the open directory.

directoryReader::~directoryReader()
{
   if (dir != NULL) closedir(dir);
}

Also, p_getfiles can be reorganized so that:

  1. You open a directory, gather all the files and sub-directories of the directory, close the directory, and then process the files and subdirectories. That way, you don't have to worry about too many open directories.

  2. You can create an instace of directoryReader on the stack instead of on the heap.

Here's a little refactored version of 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());
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top