Список файлов и их информация с использованием статистики

Я программирую FTP-сервер с использованием C ++, и мне нужно иметь возможность получить всю информацию о файлах в виде:

sent: drwxr-xr-x 1000 ubuntu ubuntu 4096 May 16 11:44 Package-Debug.bash

так что я могу отправить его клиенту. Мне это частично удалось, но я столкнулся с несколькими проблемами. Вот часть моего кода:

void Communication::LISTCommand() {
DIR *directory;
struct dirent *ent;
char path[100];
strcpy(path, this->path.c_str());  //this->path can be different from current working path

/*if (chdir(path) == -1) {
perror("Error while changing the working directory ");
close(clie_sock);
exit(1);
}*/

directory = opendir(path);
struct tm* clock;
struct stat attrib;
struct passwd *pw;
struct group *gr;
string line;
char file_info[1000];

.....

while ((ent = readdir(directory)) != NULL) {
line.clear();
stat(ent->d_name, &attrib);

clock = gmtime(&(attrib.st_mtime));
pw = getpwuid(attrib.st_uid);
gr = getgrgid(attrib.st_gid);
if (S_ISDIR(attrib.st_mode))
line.append(1, 'd');
else line.append(1, '-');
if (attrib.st_mode & S_IRUSR)
line.append(1, 'r');
else line.append(1, '-');
if (attrib.st_mode & S_IWUSR)
line.append(1, 'w');
else line.append(1, '-');
if (attrib.st_mode & S_IXUSR)
line.append(1, 'x');
else line.append(1, '-');
if (attrib.st_mode & S_IRGRP)
line.append(1, 'r');
else line.append(1, '-');
if (attrib.st_mode & S_IWGRP)
line.append(1, 'w');
else line.append(1, '-');
if (attrib.st_mode & S_IXGRP)
line.append(1, 'x');
else line.append(1, '-');
if (attrib.st_mode & S_IROTH)
line.append(1, 'r');
else line.append(1, '-');
if (attrib.st_mode & S_IWOTH)
line.append(1, 'w');
else line.append(1, '-');
if (attrib.st_mode & S_IXOTH)
line.append("x ");
else line.append("- ");

sprintf(file_info, "%s%d %s %s %d %s %d %02d:%02d %s\r\n", line.c_str(), pw->pw_uid,
pw->pw_name, gr->gr_name, (int) attrib.st_size, getMonth(clock->tm_mon).c_str(),
clock->tm_mday, clock->tm_hour, clock->tm_min, ent->d_name);

if (send(c_data_sock, file_info, strlen(file_info), 0) == -1) {
perror("Error while writing ");
close(clie_sock);
exit(1);
}

cout << "sent: " << file_info << endl;
}

.....

}

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

1

Решение

Когда вы делаете

stat(ent->d_name, &attrib);

ты должен помнить это ent->d_name содержит только имя файла, а не полный путь. Поэтому, если вы хотите перечислить файлы в каталоге, отличном от текущего каталога программ, вам нужно составить полный путь для использования.

Самое простое решение, вероятно, сделать что-то вроде

std::string full_path = path;
full_path += '/';
full_path += ent->d_name;

if (stat(full_path.c_str(), &attrib) != -1)
{
// Do your stuff here
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]