Форсировать файловую систему - Как получить время последней записи для символической ссылки без разрешения?
Предположим, у нас есть 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()
,