Неполные имена файлов в dirent.h

Пришлось сделать какое-то устаревшее кодирование в Turbo C++ для школьного проекта, когда я столкнулся с проблемой с использованием dirent.h

#include <dirent.h>
#include <stdio.h>
#include <iostream.h>

void ls(char *searchstring)
{
 DIR *directory_list;
 struct dirent *dentry;
 directory_list = opendir (searchstring);
 if (directory_list != NULL)
 {
  while ((dentry = readdir (directory_list)) != NULL)
  {
   cout << dentry->d_name << endl;
  }
 }
  closedir (directory_list);
}

void main()
{
 char searchstring[128];
 gets(searchstring);
 cout << "list of files under " << searchstring;
 ls(searchstring);
}

Этот код должен в идеале перечислить все имена файлов и папок в каталоге. Но я получаю это:

Но я понимаю Кажется, что d_name Поле, похоже, не хранит имена файлов, длина которых превышает 9 символов (включая ноль), и вместо этого усекает их с помощью "~" и числа.

Я прочитал что-то о длине строки NAME_MAX для строки в структуре dirent, но больше нигде не могу найти информацию об этом в Интернете.

Вместо этого мне нужны полные имена файлов и папок, и извините, я обязательно использую древний Turbo C++.

1 ответ

Кажется, что поле d_name, кажется, не хранит имена файлов больше 9 символов (включая ноль), а вместо этого усекает его с помощью "~" и числа.

Да, именно так записи файловой системы Windows обрабатывают обратную совместимость для длинных имен файлов, которые появились в версиях Windows95 и выше.

Компилятор Turbo C++ использует более старые стандарты, которые позволяли иметь имена файлов максимум с 8 символами, точка (.) и расширение до 3 символов.

Вместо этого мне нужны полные имена файлов и папок, и извините, я обязательно использую древний Turbo C++.

Если вы привязаны к функциям, поддерживаемым Turbo C++, нет никакого выхода, используя встроенные функции, поставляемые с компилятором.

Вы можете попытаться написать интерфейс файловой системы на низком уровне самостоятельно, но сомнительно, стоит ли это усилий.

Другие вопросы по тегам