Есть ли лимит "глубины дерева каталога папок" в Windows , Linux или же в других ОС?

Интересно узнать есть ли лимит "глубины дерева каталога папок". Под лимитом глубины я понимаю число папок которые лежат в папке как на изображении снизу.введите сюда описание изображения

Если этот лимит есть то какой он в различных ОС?


Ответы (1 шт):

Автор решения: avp

Попробовал в своем Linux

avp@avp-xubu2:~/hashcode$ uname -a
Linux avp-xubu2 4.15.0-147-generic #151-Ubuntu SMP Fri Jun 18 19:21:19 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
avp@avp-xubu2:~/hashcode$ cat /etc/issue
Ubuntu 18.04.5 LTS \n \l

avp@avp-xubu2:~/hashcode$ 

Создавал в текущем каталоге каталог с именем 1, переходил в него и повторял это в цикле.

На уровне 500000 мне надоело ждать и я остановил программу.

По ходу дела, при достижении уровня, кратного 10000 я вызывал system("df -h .");
(просто для какого-то контроля ситуации).

Начиная с уровня 70000 я получал сообщение -- sh: 1: df: Argument list too long

Похоже, что в Линукс глубина вложенности каталогов реально ограничена только количеством i-nodes в файловой системе.
У меня тут:

avp@avp-xubu2:~/hashcode$ df -ih .
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda1        6.3M  248K  6.1M    4% /
avp@avp-xubu2:~/hashcode$ 

P.S.

Эксперименты проводились вот таким кодом

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <limits.h>
#include <signal.h>

volatile int sig = 0;

void
sigh (int s)
{
  sig = 1;
}

int
main (int ac, char *av[])
{
  char s_path[1024];

  printf("PATH_MAX = %d\n", PATH_MAX);

  if (!getcwd(s_path, 1023)) {
    perror("getcwd");
    exit(1);
  }

  printf("initial dir: %s\n", s_path);

  int l, n = atoi(av[1] ? av[1] : "100000");
  if (n < 10)
    n = 10;
  int m = n > 10000 ? 10000 : 1000;

  signal(SIGINT, sigh);
  
  for (l = 0; l < n; l++) {
    if (sig) {
      printf("Level %d sigint detected\n", l);
      break;
    }
    if (mkdir("1", 0777)) {
      printf("mkdir level %d fail: %m\n", l);
      break;
    }
    if (chdir("1")) {
      printf("Can't chdir to ...%d.../'1' [%m]\n", l);
      break;
    }
    if (l % m == 0) {
      printf("level %d\n", l + 1);
      system("df -h .");
    }
  }

  printf("Level %d reached\n", l);
  if (chdir(s_path)) {
    printf("Can't chdir to %s [%m]\n", s_path);
    exit(1);
  }
  int rc = system("rm -rf 1");
  printf("system rm -rf '1' rc = %d\n", rc);
  
  return rc == 0 ? (puts("End") == EOF) : rc;
}
→ Ссылка