Почему-то вспоминается эпизод на одной из моих предыдущих работ. Я писал программное обеспечение, которое обрабатывало различные списки Excel и обычного текста. При этом осталась масса мусора в виде массивных временных файлов и журналов в нескольких каталогах в подкаталоге данных программного обеспечения. Поэтому, когда я заметил уменьшение места на диске, я решил в конце концов что-то с этим сделать и быстро написал небольшую программу, которая рекурсивно проходила по всем подкаталогам в заданном каталоге и стирала весь мусор. Я определил определенные правила: для некоторых каталогов программа проверяла, имеют ли файлы определенные расширения, такие как log или temp, а некоторые — например, безвозвратно устаревшие архивы версий программного обеспечения — просто полностью очищала, не проверяя расширения файлов или что-то еще.

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

Потом меня вдруг осенило. Когда вы пишете программу и используете команды, работающие с каталогами, вы указываете им имя каталога, например, «tmp4464». Система ищет заданное имя каталога в каталоге, который она считает текущим каталогом. Обычно это каталог, в котором находится сама программа. Зная об этом, я не волновался, потому что поместил эту утилиту очистки мусора в каталог, где изначально не было ничего особенно ценного. Как и во всех его подкаталогах. Но вот загвоздка. Есть два специальных имени каталога, которые вы можете указать в качестве аргументов для команды обработки файла, и они имеют особое значение. Одним из них является «.», который относится к текущему каталогу. И еще один «..», который относится к родительскому каталогу. Когда вы программно запрашиваете список подкаталогов, эти два элемента также присутствуют в списке.

Итак, после того, как я вдруг вспомнил об этом факте, я понял, что именно моя программа делала в этот момент. Фактически, это уничтожило весь мой компьютер.

Дело в том, что мой алгоритм работал следующим образом: он входил в каталог, удалял то, что считал мусором, запрашивал список всех подкаталогов и рекурсивно повторял процедуру для всех них. Таким образом, он обрабатывал все дерево каталогов ниже определенного каталога, заданного в качестве отправной точки. В то же время программа ограничивалась только каталогами, которые предположительно содержали в основном мусор, поэтому мне не нужно было беспокоиться о том, что она удалит что-то ценное. Так я думал.

Что я пропустил, так это то, что я забыл об имени каталога «..». Это специальное имя относится к родительскому каталогу, и когда вы включаете его в путь, компьютер понимает его как указание перейти в родительский каталог и продолжить оттуда. Так что, если я думал, что моя программа работает строго в каталоге мусора, я глубоко ошибался. На самом деле, на тот момент он уже успешно прорвался и продолжал затирать все, начиная с корня, другими словами, весь жесткий диск.

Когда я в конце концов остановил этот процесс и оценил ущерб, оказалось, что среди прочего программа уничтожила двухнедельный код, написанный для приложения, над которым я работал. И резервных копий не было. Были и другие незначительные постоянные потери, такие как небольшие приложения и утилиты, некоторая документация и так далее.

Это было немного грустно, но в то же время вся ситуация казалась мне невероятно абсурдной, вплоть до забавной. Вот в таком настроении я и рассказал коллеге о своем затруднительном положении. И он был совершенно озадачен и озадачен тем, что я такая спокойная, веселая и все такое. Типа, судя по его восприятию вещей, я должен был быть опустошен, думая о самоубийстве или что-то в этом роде. Но, хорошо, я сказал ему, что я не думаю, что все это мягкое, что исчезло навсегда, было чем-то хорошим. Например, может быть, это был своего рода знак того, что его нужно было переписать, может быть, используя лучшие подходы и методы и все такое. Итак, это был один из тех эпизодов, когда я понял для себя, как мало вещей меня на самом деле волнует. Хорошо знать )