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

mbalves

Listar directorias

Recommended Posts

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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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);
}

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.