Используйте stat -s
. Он печатает поля в том же порядке, но с метками (и без имени файла):
:; stat -s /etc/man.conf | fmt
st_dev=16777220 st_ino=641593 st_mode=0100644 st_nlink=1 st_uid=0
st_gid=0 st_rdev=0 st_size=4574 st_atime=1547885737 st_mtime=1500152545
st_ctime=1512806119 st_birthtime=1500152545 st_blksize=4194304
st_blocks=0 st_flags=32
Ваше первое загадочное поле - st_rdev
, «тип устройства, для специального файлового индекса». Поскольку мы не регистрируем файл устройства, это ноль.
Ваше второе загадочное поле - st_birthtimespec
, «время создания файла (рождения)» (см. Справочную страницу stat(2)
). Это дарвинское 64-битное расширение.
Ваш 4096 не размер файла в байтах. Это st_blksize
, «оптимальный размер блока для ввода / вывода». В моем примере это 4194304. Возможно, ваш файл находится в файловой системе HFS +. Мой находится в файловой системе APFS.
Ваше третье загадочное поле - st_flags
, «пользовательские флаги для файла». У тебя ноль, поэтому флаги не установлены. В моем примере (/etc/man.conf
) установлено UF_COMPRESSED
.
В чем разница между st_dev и st_rdev?
blockquote>Поле
st_dev
относится к устройству (жесткий диск / раздел / что угодно), содержащему файл. Полеst_rdev
для файлов устройств сообщает ядру, какое устройство представляет сам файл. Попробуйте запуститьstat
для некоторых файлов устройств в/dev
, например,/dev/null
и/dev/rdisk0
, чтобы увидеть ненулевые значенияst_rdev
.Многие, я не нашел правильную страницу руководства (ни man stat, ни man lstat). Есть ли официальная документация, которая подробно объясняет каждое поле статистики? Где я могу его найти?
blockquote>Используйте
man 1 stat
, чтобы узнать о флагах программы командной строкиstat
, например, о флаге-s
, который я использовал. Затем используйтеman 2 stat
и ваш любимый поисковик, чтобы узнать, что означают поля.
Второй пример плох. Вы берете много издержек для ловли исключения, когда, как Вы демонстрируете, столь же легко предотвратить исключение во-первых. Плюс Вы также предполагают, что Вы знаете, почему то исключение было выдано - если было некоторое другое исключение, как говорят из памяти или чего-то, Вы сообщаете об этом как о "поле, не найденном", даже если это не было.
Следует иметь в виду это try
/catch
на языках как C++ и Java являются очень дорогими из-за всего состояния, которое они должны сохранить и восстановить. Python, с другой стороны, имеет очень дешевые исключения, и они положительно поощряют Вас использовать a try
/except
для простой проверки. Но несмотря на это, ловя все и притворяясь это - один тип исключения, все еще плохо.
//First let's do the checks.
if(!isset($this->dbfields[$var]))
throw new FieldNotFoundException($var);
//Now we're in the clear!
return $this->dbfields[$var];
Ловлю "Исключения", большую часть времени, не считают хорошей практикой из двух, которые Вы отобразили, я буду использовать опцию 1.
Ловля всех исключений может скрыть другое исключение и замаскировать его как FileNotFoundException.
Я предпочитаю первый, но если dbfields [$var] бросают что-то разумное при доступе к несуществующему элементу затем я предпочел бы просто возвращать его без проверки.
Мне особенно не нравится изменять тип исключительной ситуации, если у меня нет серьезного основания - также, если Вы делаете, удостоверьтесь, что попытались сохранить исходное исключение и отслеживание стека.
"... или что-то еще в целом?"
Ни один не очень хорош, таким образом, что-то еще было бы соответствующим.
Зафиксируйте версию 2 для ловли корректного исключения, не каждого возможного исключения. Сообщение, что как опция 3. Я буду upvote что-то, что ловит определенное исключение вместо Exception
.
Просто перечитайте свое объяснение.
Я предполагаю, что Ваш метод там в № 1 собирается поймать любые исключения, которые могли бы быть выданы и просто возвратить bool. Мне определенно не нравится ловля универсального исключения большую часть времени, таким образом, № 2 не был бы моим выбором.
Это далеко от агностика языка.
Некоторые языки не бросят ошибки для доступа к несуществующим полям, и предпочтительный шаблон во многом зависит от реализаций массивов, таблиц, объектов, и т.д.