Правила таковы:
Не используйте отступы для корневого (или базового) каталога.
Начиная со старшего родителя, вплоть до родителя, проверьте, является ли родительский каталог последним элементом в его собственном родительском каталоге.Для тех, которые есть, используйте
для отступа;в противном случае используйте │
.
Если текущий элемент является последним элементом в родительском каталоге, используйте └─
для отступа;в противном случае используйте ├─
.
На практике вам необходимо сканировать (и запоминать) содержимое каталога, прежде чем переходить к любому из его подкаталогов.
Если вы делаете это рекурсивно, вы можете использовать один динамически выделенный буфер для отступа;он содержит вертикальные полосы и пробелы для родительских каталогов.Последний элемент (с горизонтальной полосой) печатается отдельно.Когда вы делаете рекурсивный вызов для печати содержимого подкаталога, сначала добавьте пробел или вертикальную черту к строке отступа (в зависимости от того, является ли подкаталог последним элементом в текущем каталоге или нет).После рекурсивного вызова обрежьте строку отступа до ее первоначальной длины.
Обратите внимание, что вам придется хранить имена элементов в каталоге в массиве или связанном списке, потому что все они нужны перед повторениемв любой подкаталог.Если вы этого не сделаете, вы не сможете узнать, является ли элемент последним в своем каталоге или нет, и вы не сможете сделать вывод правильно.Вы должны хранить имена динамически, без ограничений по количеству или длине, потому что на практике таких ограничений нет.(Даже если на некоторых машинах существуют некоторые ограничения, они зависят от используемой файловой системы и не могут быть обнаружены в действительности, за исключением случаев их превышения.)
Тестовая реализация, которую я написал, используя nftw()
, чтобы сначала построить полную древовидную структуру, а затем распечатать ее, было длиной около 300 строк, включая все проверки ошибок.Нет, я не буду публиковать это, потому что это будет неправильно использоваться гнусными студентами, которые будут рассматриваться как их собственная работа.