2008-10-15 7 views
2

Знаете ли вы о серьезных проблемах с производительностью при проверке наличия файла перед его открытием и отправкой? Контекстом для этого является веб-приложение, которое динамически обрабатывает файлы через страницу ASP. Мне сказали, что нет проверки того, существует ли файл, потому что база данных хранит эту информацию и не должна ошибаться. Конечно, иногда бывает не так по ряду причин, поэтому мы в итоге не возвращаем ничего, оставляя пользователя несчастным.Проверка работоспособности ввода-вывода - проверка наличия файла

Мой инстинкт заключается в том, что проверка существования файла настолько дешева, что вы не должны беспокоиться об этом, но мне сказали иначе. Наше решение для хранения данных является довольно мощным (а не только IDE-накопителем на веб-сервере), если это помогает. Мой вопрос в основном: правилен ли мой инстинкт?

Спасибо!

Примечание. Эти файлы никогда не удаляются. Что-то должно пойти не так, чтобы их не хватало, но это случается несколько раз в неделю. Кроме того, причина, по которой я хочу проверить существование файла, заключается в том, что я могу вернуть альтернативный актив, который находится на диске, поэтому я хотел бы иметь эту логику в одном месте, а не заниматься исключением и заниматься что в этом контексте.

+0

Я единственный, кто думал, что этот пост связан с Ктулху? –

ответ

5

Даже если вы проверили его как раз перед тем, как попытаться его обслужить, его можно будет удалить между проверкой и обслуживанием.

Проблема в том, что вы ничего не отправляете, если не можете служить файлу. Попытка обслуживать несуществующий файл должна генерировать исключение (или что бы то ни было эквивалент на вашей платформе) - вы должны обработать это исключение, вернув соответствующую страницу ошибки «Извините, мы не смогли найти ваш файл».

+0

Что делать, если он должен был открыть файл, а не проверять его существование, а затем, если исключить поток открытого файла? Считаете ли вы, что это разрешит потенциальную проблему, которую вы только что описали? – Guy

+0

@Guy: Это звучит как приличная идея. –

+0

@Guy: Да, но это эквивалентно «попытаться обслужить файл, если он будет работать, и поймать исключение, если он не сработает» на мой взгляд :) (Он также может обрабатывать «Я не могу прочитать все файл данных ", который не очень отличается по отношению к пользователю.) –

1

Вы не должны испытывать серьезных проблем с производительностью до тех пор, пока не используете какую-то действительно странную схему хранения.

1

Я не знаю серьезных проблем с этим аспектом работы, но проверка наличия файла перед его открытием может иметь неожиданные результаты (другой процесс может удалить файл между проверкой и открыть его).

3

Если файл не является исключительным обстоятельством (как вы говорите, он всегда прав), вы не должны его проверять.

Если его нет, вы получаете исключение и обрабатываете его соответствующим образом. Кажется, это так, как вы говорите, что система работает, и я бы рассматривал ее как таковую.

Еще одно замечание. Если ваше высказывание о том, что файл, не находящийся при открытии, просто ничего не возвращает, то это говорит мне, что в вашем исключении хеддинг есть недостаток дизайна, а ваш более низкий уровень не слишком близок к исключению для правильной обработки, чтобы вы могли передать сообщение об ошибке клиенту.

С надлежащей обработкой исключений/выпуском вы не должны испытывать проблем с возвратом дополнительного актива. Пересмотрите обработку исключений, а не переработайте способ работы системы.

0

Я действительно не знаю, является ли это дешевой или дорогостоящей задачей, но, учитывая, что не проверка наличия файла может привести к неприятному ответу на клиента, я бы сказал, что это не дорого.

У меня есть некоторые веб-приложения, где я проверяю наличие файлов и работает нормально.

0

Переадресовываете ли вы файл или читаете и обслуживаете содержимое файла с помощью кода?

Если первое, что произойдет, если файл по какой-либо причине не существует? Стандартная ошибка 404, или у вас есть специализированная страница с ошибками? Это приемлемо для этого случая?

Если последний, просто откройте файл и обработайте исключение соответствующим образом.

0

Файл IO обычно является дорогостоящим по сравнению с чтением в базе данных или в памяти, но я слышал, что старая «база данных хранит информацию, чтобы она не была ошибкой» слишком много раз при поиске системного сбоя или необработанного исключение. Поэтому я бы проверял существование и восстанавливал элегантность, если ваши требования к производительности необычно высоки.

0

Если не проверяет файл, файл вызывает путаницу для пользователя и/или не дает им то, что им нужно, или, по крайней мере, отображает сообщение об ошибке, указывающее на проблему, - тогда неважно, ,

Приложение необходимо чек.

+0

Если это вызывает конфуцию, ему не нужна проверка, для этого требуется улучшенная обработка ошибок, например, правильная обработка исключения. – mattlant

0

Производительность должна быть практически без воздействия. Медленная часть здесь идет на диск, чтобы прочитать заголовок файла, но если вы собираетесь загрузить файл, вам все равно придется это делать, и любая приличная система хранения (почти любая из последних десятилетий) будет кешируйте чтение из проверки, чтобы часть чтения была намного быстрее, когда вы действительно открываете файл. Сказав это, я согласен с mattlant, что было бы лучше поймать файл, если бы не исключение, и справиться с ним должным образом, если файл, как правило, ожидается там.

0

Если вы собираетесь открыть его сразу же после этого, то проверка его существования по существу бесплатно.

0

Попробуйте открыть файл и затем передать его. Это возможность? Таким образом, если вы не можете открыть и потопить его, вы не сможете отправить его и сможете выполнить соответствующую обработку ошибок.

Смежные вопросы