目录列表程序未正确打开

时间:2014-05-09 16:14:19

标签: c++ linux filesystems dirent.h

这是代码(针对整个项目)

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,因为文件永远不会写入也不会打开)

1 个答案:

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

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

  2. 您可以在堆栈上而不是在堆上创建directoryReader的实例。

  3. 这是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());
       }
    }