Класс C ++ не обнаруживает символические ссылки - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть класс C ++, который читает информацию о файле, используя stat.он устанавливает dir и reg true для соответствующих файлов, но lnk остается false, когда я проверяю его по известной ссылке sym на моем компьютере с Ubuntu ("/vmlinuz.old").это устанавливает истину в этой ситуации.Код моего кода уточняется здесь: http://linux.die.net/man/2/stat (прогуляйтесь до кнопки)

class file_info
{
  public:
    string size;
    string owner;
    string group;
    string path;

    string acc_time;
    string mod_time;
    string cre_time;

    bool read;
    bool write;
    bool exec;

    bool dir;
    bool lnk;
    bool reg;
    bool fail;

  private:
    struct stat f_stat;

    void set_size()
    {
      string raw_size = to_string(f_stat.st_size);
      unsigned int len = raw_size.size();
      size = "";

      if (len <= 3)
      {
        size += raw_size;
        size += "Bytes";
        return;
      }

      size += raw_size[len - 1];
      size += ".";
      size += raw_size[len - 2];

      if ((len > 3) && (len < 6))         size += "KB";
      else if ((len >= 6) && (len < 9))   size += "MB";
      else if ((len >= 9) && (len < 12))  size += "GB";
      else if ((len >= 12) && (len < 15)) size += "TB";
      else if ((len >= 15) && (len < 18)) size += "PB";
      else if ((len >= 18) && (len < 21)) size += "EB";
      else size = "OL";
    }

  private:
    void get_info()
    {
      switch (f_stat.st_mode & S_IFMT)
      {
        case S_IFDIR: dir = true; break;
        case S_IFREG: reg = true; break;
        case S_IFLNK: lnk = true; break;
        default: fail = true; break;
      }

      if (!fail)
      {
        if (f_stat.st_mode & S_IRUSR) read = true;
        if (f_stat.st_mode & S_IWUSR) write = true;
        if (f_stat.st_mode & S_IXUSR) exec = true;

        struct passwd *pw = getpwuid(f_stat.st_uid);
        struct group *gr = getgrgid(f_stat.st_gid);

        if (pw != NULL) owner = pw->pw_name;
        if (gr != NULL) group = gr->gr_name;

        set_size();       
        acc_time = ctime(&f_stat.st_atime);
        mod_time = ctime(&f_stat.st_mtime);
        cre_time = ctime(&f_stat.st_ctime);

        acc_time.erase(acc_time.end() - 1, acc_time.end());
        mod_time.erase(mod_time.end() - 1, mod_time.end());
        cre_time.erase(cre_time.end() - 1, cre_time.end());
      }
    }

  public:
    file_info(string file): dir(false),
                            lnk(false),
                            reg(false),
                            fail(false),
                            read(false),
                            write(false),
                            exec(false)
    {
      path = file;

      if (stat(file.c_str(), &f_stat))
      {
        fail = true;
      }
      else
      {
        get_info();
      }
    } 
};

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

stat() возвращает информацию о файле, на который указывает символьная ссылка ... try lstat()

1 голос
/ 16 февраля 2012

Если я не ошибаюсь, вы используете системный вызов stat (), чтобы проверить, является ли файл символической ссылкой или нет, используя флаг S_IFLNK. Вот цитата из справочной страницы:

stat() stats the file pointed to by path and fills in buf.

lstat() is identical to stat(), except that if path is a symbolic link,
then the link itself is stat-ed, not the file that it refers to.

Попробуйте использовать lstat () вместо stat (). stat () следует по ссылке и возвращает, что файл, на который ссылается ссылка, действительно является каталогом или обычным файлом.

...