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

Предположим, у нас есть 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.

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

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;
}

person OneRaynyDay    schedule 09.06.2018    source источник
comment
boost::filesystem должна быть более универсальной, чем ваша файловая система, поддерживающая символические ссылки. ИМХО это очень разумное поведение.   -  person Captain Giraffe    schedule 10.06.2018
comment
Я понимаю, что он должен быть более общим, поскольку он переносим между файловыми системами, которые не поддерживают символические ссылки. Однако, чтобы он был достаточно мощным для использования в определенных файловых системах, которые его поддерживают (то есть в большинстве разновидностей Linux), он должен предоставлять API, который не заставляет пользователя возвращаться к использованию низкоуровневого C.   -  person OneRaynyDay    schedule 10.06.2018


Ответы (1)


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

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

person John Zwinck    schedule 10.06.2018