Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

mbalves

Listar directorias

Mensagens Recomendadas

mbalves

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg
#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;
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mbalves

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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg
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.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O que é o ftw.h?

É um header específico do POSIX, não faz parte da biblioteca standard do C.

Mas o POSIX é quase tão abrangente como o C (não sei se o Visual Studio inclui esse header).

http://www.opengroup.org/onlinepubs/007908799/xsh/ftw.h.html


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mbalves

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;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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 :|


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.