Неполные имена файлов в 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++, нет никакого выхода, используя встроенные функции, поставляемые с компилятором.
Вы можете попытаться написать интерфейс файловой системы на низком уровне самостоятельно, но сомнительно, стоит ли это усилий.