Форсировать файловую систему - Как получить время последней записи для символической ссылки без разрешения?

Предположим, у нас есть 2 файла:

lrwxrwxrwx 1 ... 3 Jun  8 09:42 d3 -> dir
d--------- 3 ... 80 Jun  9 16:14 dir

Одна - это символическая ссылка на каталог, а другая - это фактический каталог.

Когда я пишу

namespace fs = boost::filesystem;
std::cout << "last write time for symlink : " << 
    fs::last_write_time("x/d3") << " and the actual dir : " <<
    fs::last_write_time("x/dir") << std::endl;

Я вернусь:

last write time for symlink : 1528578878 and the actual dir : 1528578878

Это означает, что last_write_time решает мой путь, который я ввожу. Как я использую boost::filesystem получить актуальную статистику?

Если нет, то думаю придется прибегнуть к lstatс использованием символической ссылки, которая хороша, но немного вонючая необходимость перейти от современных с ++ к низкоуровневым системным вызовам с.

Вот пример lstat Решение (todo: очевидно, выбрасывать лучшее исключение):

std::time_t last_write_time(const fs::path& p){
    struct stat s;
    if(lstat(p.c_str(), &s) == -1)
        throw "last_write_time failed.";
    return s.st_mtime;
}

1 ответ

К сожалению, мы можем видеть из operations.cpp что единственный lstat() вызов в Boost Filesystem находится в symlink_status(), который возвращает только тип файла и разрешения, а не метки времени.

Так что сейчас вам не повезло, но вы можете попробовать отправить патч, так как очевидно, что Boost Filesystem не против использования lstat(),

Другие вопросы по тегам