2014-12-10 4 views
0

Справочная информация:"retsize <= sizeInWords" в mbstowcs в dirent.h на Windows,

Я строю дерево файлов в окнах с помощью dirent.h (требование проекта) на VS2013. Я получил dirent.h от here. Я сбою во время выполнения с отладочным утверждением не удался ("retsize < = sizeInWords") из КРТА \ crtw32 \ mbstowcs.c, строка 283.

Чтобы проверить dirent.h, я использовал

void printDir(std::string dir, std::string tab) 
{ 
    DIR* d = opendir(dir.c_str()); 
    dirent* ent = nullptr; 
    while (ent = readdir(d)) { 
    if (ent->d_name[0] != '.') { 
     std::cout << tab << ent->d_name << std::endl; 
     if (ent->d_type == DT_DIR) { 
     printDir(dir + "/" + ent->d_name, tab + " "); 
     } 
    } 
    } 
} 

, который работал (" "вызывается из основной, как printDir (""))

так, чтобы построить свое дерево у меня есть:

struct Dirf { 
    std::string getFullPath() { 
    if (out) { 
     return out->getFullPath() + "/" + ent.d_name; 
    } 
    else return ent.d_name; 
    } 

    Dirf(DIR* dir, Dirf* parent = nullptr) 
    : out(parent) 
    { 
    if (dir) { 
     dirent* d = readdir(dir); 
     if (d) { 
     ent = *d; 
     if (dir) { 
      next = std::make_shared<Dirf>(dir, parent); 
     } 
     if (ent.d_type == DT_DIR) { 
      DIR* inDir = opendir(getFullPath().c_str()); 
      in = std::make_shared<Dirf>(inDir, this); 
      closedir(inDir); 
     } 
     } 
    } 
    } 

private: 
    typedef std::shared_ptr<Dirf> point; 
    friend std::string to_string(Dirf, std::string); 

    dirent ent; 
    Dirf* out; // parent to this; in->out == this, out->in == this; 
    point in, // in != null iff car.d_type == DT_DIR 
     next; // next entry in the dir 
}; 

std::string to_string(Dirf, std::string tab = ""); 

Однако, называя Dirf (opendir (".")) не с отладки утверждение описывает d выше

ответ

1

При составлении вопроса я понял ответ: я забыл проверить «.». и ".." в конструкторе Dirf (я вспомнил, что сделал это в своем тестовом примере). Добавление

while (d && d->d_name[0] == '.') { // skip '..' and '.' 
    d = readdir(dir); 
} 

после dirent* d = readdir(dir) ошибка сделана.