Может ли std :: ifstream получить уникальную идентификацию файла

Мы можем использовать stat, чтобы получить номер inode, который может однозначно идентифицировать объект в системе. код:

int ret = stat(file_name, &file_info);
if (ret != 0) {
   //report error
}
std::cout << file_info.st_ino; inode numb
std::cout = file_info.st_dev;
std::cout = file_info.st_mtime;

Таким образом, мы можем проверить, был ли файл перемещен или переименован. Есть еще одна функция fstat, которая принимает int fd, а не имя файла. Использование имени файла не является хорошим решением, потому что файл может быть перемещен после того, как мы его проверим. Например:

stat(file_name)
the inode num is same as before. so the file has not been moved.
-- the file has be moved, but we can not known--//
we open the file
we process new file use old file info

fstat(fd)
the inode num is same as before. so the file has not been moved.
-- the file has be moved
ok. we process the old file  use old file info.

Все идет хорошо, пока я не использую c ++ ifstream, как это сделать? Получите fd за ifstream ?? или использовать struct file *file?

Все могут мне помочь?


person Arthur George    schedule 04.04.2018    source источник
comment
привет, джамек, мы должны использовать fd и fstat для получения уникальной идентификации (и т. д. inode id)? есть ли другая функция, чтобы получить его напрямую из istream?   -  person Arthur George    schedule 04.04.2018
comment
Короткий ответ: нет. Стандарт C ++ не определяет, как реализованы iostreams. Номера inode являются деталью реализации в НЕКОТОРЫХ системах, но не в других.   -  person Peter    schedule 04.04.2018
comment
Вы читали? Нет, нет. Вы должны сделать это самостоятельно, позже, если вы захотите найти файл по inode, используйте ftw или аналогичную функцию - это зависит от вашей операционной системы. stackoverflow.com/a/109522/2493292   -  person jamek    schedule 04.04.2018