C ++ stat(const char * d_name)始终返回-1

时间:2018-04-17 12:23:08

标签: c++ stat

我已经实现了如下方法:

long getSize(const char *d_name)
{
    struct stat buff {};

    // stat(const char* var) always returns -1
    int exists = stat(d_name, &buff);

    long totalSize = 0;

    // So totalSize never increases
    if (exists > -1)
        totalSize += buff.st_size;

    return totalSize;
} 

我也有一个结构:

struct Entity
{
    string name;
    string type;
    long size;
    string created_at;
    string modofied_at; // equivalence to "modified" phrase
    bool isHidden;
};

我想迭代特定路径中的文件,并将其数据(大小,名称等)定位到包含每个实体(文件或目录)结构的向量中。所以我实现了这个:

vector<Entity> getEntities(const char *path)
{
    vector<Entity> entities;

    DIR *dir;
    struct dirent *ent;

    /** if path exists **/
    if ((dir = opendir(path)) == nullptr)
    {
        /* could not open directory */
        perror("path_invalid");
        exit(1);
    }

    /** loop over entities till encounters nullptr **/
    while ((ent = readdir(dir)) != nullptr)
    {
        Entity entity;

        entity.name = ent->d_name;

        // This member is always 0
        entity.size = this->getSize(ent->d_name);

        entity.isHidden = this->isHidden(ent->d_name);
        entities.push_back(entity);
    }

    closedir(dir);
    return entities;
} 

问题是stat始终返回-1。所以实体的大小总是会被意外地分配给0。

1 个答案:

答案 0 :(得分:2)

const html = require('choo/html')
const css = require('sheetify')

const yourVariable = css`
  :host {
    color: red;
  }

@media screen and (min-width: 768px) {
    :host {
      color: blue;
    }
  }

`
const yourComponent = () => {
 return html`
         <h1 class=${yourVariable}>This text is styled</h1>
 `
}
module.exports = yourComponent

假设你在这里打开了“/ etc”目录。在这里,if ((dir = opendir(path)) == nullptr) 将是“/ etc”。

然后代码继续遍历目录。假设找到path文件;那就是你现在正在使用“/ etc / passwd”。

passwd

entity.size = this->getSize(ent->d_name); 将在此处“密码”。这是该目录中此文件的名称。然后,当您开始工作时,您的代码会这样做:

d_name

当然,这将失败并返回-1。这会尝试int exists = stat(d_name, &buff); 名为“passwd”的文件。

当然,不存在这样的文件。该文件是“/ etc / passwd”。

您需要将目录名称添加到文件名称之前,以形成完整的路径名。出于调试目的,请确保在stat()之前打印路径名字符串,以验证是否正确添加了目录名称。