Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Просмотр даты создания файла из C-программы  (Прочитано 2617 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Roen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Добрый вечер!

Интересует вопрос, есть ли возможность получить даты создания файла через какой-нибудь системный вызов из C-программы?

Чувствую, что при использовании opendir() и readdir(), когда последняя выдает указатель на struct dirent, есть какая-то возможность вытянуть оттуда эту информацию... Структура выглядит следующим образом (/usr/include/bits/dirent.h):
struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];
  };
С d_name  понятно - это имя объекта внутри данной директории. Что за d_ino, d_off,  d_reclen и d_type ?

UPD:
Посмотрел в файле /usr/include/bits/types.h , там для этих типов сказано:
__ino_t;        /* Type of file serial numbers.  */
__off_t;        /* Type of file sizes and offsets.  */

Как я понял, речь идет о серийном номере ,размере и смещении (?). А где все же посмотреть дату создания, ведь в граф. режиме при просмотре свойста файла две даты фигурируют. Как их выдернуть?

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля

Оффлайн Roen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
http://www.cyberforum.ru/cpp-beginners/thread36957.html

то, не то???
Трудно сказать. Насколько я понимаю, суть заключается вот в этих строках:
struct _finddata_t c_file;ctime( &( c_file.time_write ) )
Остается только вопрос, где объявлена структура _finddata_t? Буду искать...

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Правильный ответ был несколько выше.
Даты создания, модификации и последнего доступа можно получить с помощью функции stat (man 2 stat)
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Roen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Правильный ответ был несколько выше.
Даты создания, модификации и последнего доступа можно получить с помощью функции stat (man 2 stat)
Разве это не вызов из оболочки? Мне нужен вызов из С-программы.
Кстати, stat выдает три параметра, относящиеся ко времени: Access, Modify, Change. Какой из них - дата создания? Разве это не Доступ, Изменен, Изменен (?)

Вообще, что значат строки Дата доступа и Изменен, пусть даже в окне свойства (там только 2 пункта)? Если дата доступа - это когда я последний раз его открывал - то данные неверные. Если Изменен - это время последнего изменения, то данные неверные.
« Последнее редактирование: 18 Май 2010, 16:41:31 от Roen »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Разве это не вызов из оболочки? Мне нужен вызов из С-программы.
Кстати, stat выдает три параметра, относящиеся ко времени: Access, Modify, Change. Какой из них - дата создания? Разве это не Доступ, Изменен, Изменен (?)
В системе есть и то, и то. Команда man 2 stat покажет функцию.

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 18 Май 2010, 16:50:44 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Roen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Разве это не вызов из оболочки? Мне нужен вызов из С-программы.
Кстати, stat выдает три параметра, относящиеся ко времени: Access, Modify, Change. Какой из них - дата создания? Разве это не Доступ, Изменен, Изменен (?)
В системе есть и то, и то. Команда man 2 stat покажет функцию.
У меня эта команда почему-то не выполняется. Пишет, что нет страницы для нее.

Цитировать
The field st_atime is changed by file accesses, for example, by execve(2), mknod(2), pipe(2), utime(2) and read(2)
       (of more than zero bytes).  Other routines, like mmap(2), may or may not update st_atime.
Замечательно...  :-


Цитировать
      The field st_mtime is changed by file modifications, for example, by mknod(2), truncate(2), utime(2) and  write(2)
       (of  more  than zero bytes).  Moreover, st_mtime of a directory is changed by the creation or deletion of files in
       that directory.  The st_mtime field is not changed for changes in owner, group, hard link count, or mode.

       The field st_ctime is changed by writing or by setting inode information (i.e., owner, group,  link  count,  mode,
       etc.).
Как я понял, под датой создания можно понимать поле change (Изменен). Access (Доступ) - это точно не то, а Modify вроде бы и включает в себя Change, но может меняться не только из-за создания (write) файла. Хотя, опять же, write необязательно файл создает, может и просто перезаписать уже имеющийся.

В общем, надо сказать,  что сложилось мнение. как-то в линуксе криво это реализовано. В той же порицаемой всеми Винде как-то понятнее с этим: есть дата создания, она не меняется, и дата изменения (вроде еще и открытия тоже есть) - и все нормально работает.




Пользователь решил продолжить мысль 18 Май 2010, 17:31:43:
Разве это не вызов из оболочки? Мне нужен вызов из С-программы.
Кстати, stat выдает три параметра, относящиеся ко времени: Access, Modify, Change. Какой из них - дата создания? Разве это не Доступ, Изменен, Изменен (?)
В системе есть и то, и то. Команда man 2 stat покажет функцию.

(Нажмите, чтобы показать/скрыть)



wl
Цитировать
В системе есть и то, и то
Вы не могли бы тогда буквально одной строкой кода показать, как ее вызвать из C-программы?




Пользователь решил продолжить мысль 18 Май 2010, 21:34:11:
нашел в сети описание этой функции (системного вызова). Странно, при наборе
man stat
выдавалась справка по команде оболочки, а не системного вызова,  при
man 2 stat
вообще ничего, гворилось, что нет справочной страницы. Почему?

В принципе, вопрос решен, на всякий случай, если кому понадобится, вот тут можно посмотреть:
http://www.opennet.ru/man.shtml?topic=stat&category=2&russian=2

Благодарю всех за помощь!
« Последнее редактирование: 18 Май 2010, 23:35:38 от Roen »

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
По умолчанию, в Ubuntu отсутствуют страницы руководств по системным вызовам, чтобы их добавить, надо поставить пакет manpages-dev. Или установить маны с kernel.org

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
#include <sys/stat.h>

struct stat buf;
char *filename;
stat(filename,&buf);
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Roen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Все, разобрался, еще раз спасибо!

 

Страница сгенерирована за 0.059 секунд. Запросов: 24.