безопасно читать содержимое каталога - PullRequest
0 голосов
/ 23 марта 2010

Безопасно ли читать записи каталога с помощью readdir () или scandir (), когда файлы создаются или удаляются в этом каталоге? Должен ли я предпочесть одно другому?

РЕДАКТИРОВАТЬ: когда я говорю «безопасный», я имею в виду записи, возвращаемые этими функциями, действительны и могут работать без сбоя программы.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

Зависит от того, что вы подразумеваете под «безопасным». Они безопасны в том смысле, что не должны сбивать вашу программу. Однако, если вы создаете / удаляете файлы, когда читаете / сканируете этот каталог, набор файлов, который вы получаете, может быть устаревшим.

При чтении / сканировании каталога на предмет записей каталога указатель файла (каталог - это просто особый тип файла) перемещается вперед. Однако, в зависимости от файловой системы, может не быть ничего, что могло бы помешать созданию новых файлов в пустом слоте записи каталога за указателем файла. Следовательно, вновь добавленные записи каталога не могут быть немедленно обнаружены readdir () / scandir (). Аналогичные рассуждения применимы к удалению файла / удалению записи каталога.

Надеюсь, это поможет.

1 голос
/ 24 марта 2010

Какое у вас определение безопасности? Вы не будете сбивать систему, а readdir / scandir не будет сбивать вашу программу. Хотя они могут дать вам данные, которые немедленно устарели.

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

В UNIX-подобных системах readdir () и scandir () - это библиотечные функции, реализованные поверх одного и того же системного вызова (getdents () в Linux, getdirentries () в BSD). Поэтому не должно быть большой разницы в их поведении в этом отношении. Я думаю, что readdir () немного более стандартен и поэтому будет более переносимым.

...