• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

mbalves

Listar directorias

9 mensagens neste tópico

Boas,

Estou um tipo de shell numa cadeira e estou a ter duvidas pois não sei como poderei fazer o comando listar que faz o seguinte:

> listar /usr/lib

crt1.o          3039 bytes [F 644] - 10342

gcc            4096 bytes [D 755] - 10486

java            4096 bytes [D 755] - 20385

libc.a      2602114 bytes [F 644] - 84765

libX11.a    1515146 bytes [F 644] - 18457

a minha duvida reside principalmente como eu posso imprimir as linhas formatadas desta maneiras.

cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
#include <stdio.h>

void format_item(char *buf, const char *nome, int size, int tipo, int modo, int unknown)
{
  /* TODO: VALIDATION AND ERROR CHECKING */
  sprintf(buf, "%-12s %8d bytes [%c %03d] - %d", nome, size, tipo, modo, unknown);
}

int main(void)
{
  char line[80];

  format_item(line, "crt1.o", 3039, 'F', 644, 10342);
  puts(line);
  format_item(line, "gcc", 4096, 'D', 755, 10486);
  puts(line);
  format_item(line, "java", 4096, 'D', 755, 20385);
  puts(line);
  format_item(line, "libc.a", 2602114, 'F', 644, 84765);
  puts(line);
  format_item(line, "libX11.a", 1515146, 'F', 644, 18457);
  puts(line);
  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O objectivo não será fazer assim.Quando o programa está a executar se eu faço o comando ">Listar [uma directoria à minha escolha" ele tem que listar o que está na directoria.Um tipo de ls da linha de comandos do linux.

eu fiz o seguinte código mas não será bem assim.Se alguem me puder ajudar agradecia bastante.

#include <sys/stat.h>
#include <ftw.h>

int list(const char *name, const struct stat *status, int type)
	{
		/* if the stat call failed, just return */
		if(type == FTW_NS)
			return 0;
		/*
		* otherwise print object name,
		* permitions and "*" postfix
		* if object is a directory or symbolic link
		*/
		if(type == FTW_F)
			printf("%-30s\t0%3o\n",name, status ->st_mode&0777);
		else
			printf("%-30s*\t0%3o\n",name, status ->st_mode&0777);
		return 0;
	}

int main(int argc, char **argv)
{
	int list(const char *, const struct stat *, int);

	if(argc == 1)
		ftw(".",list,1);
	else
		ftw(agrv[1],list,1);
	exit(0);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
eu fiz o seguinte código mas não será bem assim.Se alguem me puder ajudar agradecia bastante.

Tás quase lá.

Só te falta, nas linhas com o printf(), formatar e imprimir o resto das informações que pretendes.

A função list recebe o parametro "status", que tem tudo o resto do que precisas.

A documentação do teu compilador deve explicar quais são os membros da "struct stat" e quais os cuidados que deves ter a interpretar os valores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu construi este novo codigo, será que ando la perto?

#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <Comandos_Internos.h> //Ja contém 4 comandos criados por mim
#include <ftw.h>

int listar(const char *name)
{
struct dirent *d;
DIR *dp;

if((dp=opendir(name) == NULL)
return -1;

while(d=readdir(dp))
{
if(d->d_ino!=0) 
{
	const char *path = strcat(get_pwd());
	int stat(const char path, struct stat );
	printf("%-30s %9d bytes [%c %03o] - %9d\n",d->d_name, d->d_reclen,d_type,st_mode&0777,d->d_ino);
}

closedir(dp);
return(0);
}

int list(const char *name, const struct stat *sptr, int type) 
{
if(type==FTW_NS) 
ErrorFound(5);

if(type==FTW_F)
printf("%-30s\t\t %9d bytes [%c %03o] - %9d\n", name, status->st_size.'F',status->st_mode&0777,status->st_ino);
else
printf("%-30s\t\t %9d bytes [%c %03o] - %9d\n", name, status->st_blksize.'D',status->st_mode&0777,status->st_ino);
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ciclo de desenvolvimento:

1) Make it run

2) Make it right

N) change and repeat from 1)

8246877853) Make it fast

N) go back to 1)

876448978246877854) Make it small

Ainda nem chegaste ao 1). Não se pode dizer que andas lá perto :|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora