Возможно ли получить и установить имя файла с помощью дескриптора struct stat? - PullRequest
5 голосов
/ 25 декабря 2010

Возможно ли получить или установить (переименовать) имя файла с указанием абсолютного пути к файлу и экземпляра struct stat в качестве параметров функции lstat.Как я нахожу в документации, структура выглядит так;

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* protection */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;  /* number of blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

Я хочу что-то в этом роде;

struct stat *s;
char *path; // assigning the ablosute path of file
int res = lstat(path, s);
if(res == -1)
   return errno;
char *name = s->(someFielAboutFileName);
or
s->(someFieldAboutFileName) = name; // setting name

Ответы [ 3 ]

2 голосов
/ 25 декабря 2010

Нет. В Unix имя не является свойством файла. Файл может иметь несколько имен (см. Жесткие ссылки) или даже не иметь их.

Имена - это просто записи в каталогах.

1 голос
/ 25 декабря 2010

В Unix имя файла принадлежит каталогу, а не файлу. Это означает, что один и тот же файл может иметь несколько имен (в Unix это называется «жесткие ссылки»). Это также означает, что вы не можете узнать имя из stat, поскольку оно имеет дело с файлами, а не с именами. Вы можете использовать realpath, чтобы найти настоящее имя файла с разрешением символических ссылок и т. Д.

0 голосов
/ 25 декабря 2010

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

Возможно, вам придется unlink () символьную ссылку, а затем вызвать symlink () , чтобы воссоздать ее и указать на другой файл:

unlink(path);
symlink(name, path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...