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

Предположим, у нас есть 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, используя символическую ссылку, что хорошо, но немного вонючий, чтобы двигатьсяот современного c ++ до низкоуровневых системных вызовов c.

Вот пример решения 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 Ответ

0 голосов
/ 10 июня 2018

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

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

...