Coder dans plusieurs langages

Bonjour,

Je viens de m’apercevoir d’un post donnant une solution dans plusieurs langages différents, et je vous propose de faire la même chose mais de manière ludique. C’est à dire de proposer un code plus ou moins simple à faire et de donner la solution dans tous les langages que vous pouvez connaitre. Les variantes de langages sont autorisées, l’usage de design pattern aussi bien que pour certain code cela est bien inutile il peut être amusant de s’en servir quand même.

Donc voilà premier sujet un simple Hello World et pour corser un peu la chose le second sujet est un moyen d’afficher le contenu d’un répertoire de manière récursive avec l’indentation qui va bien. Exemple de résultat attendu pour le second sujet

+_ repertoire1 |_ repertoire2 |+ repertoire3 ||_ sousRepertoire1 +_ repertoire4 +_ repertoire5

Amusez-vous bien

En même temps ?

[code]cat =13 /*/ >/dev/null 2>&1; echo “Hello, world!”; exit
*

  • This program works under cc, f77, and /bin/sh.

/; main() {
write(
cat-~-cat
/
,’(
/
,“Hello, world!”
,
cat); putchar(~-~-~-cat); } /

,)’)
end
*/[/code]
Source

:mrgreen:

+_ repertoire1 |_ repertoire2 |+ repertoire3 ||_ sousRepertoire1 +_ repertoire4 +_ repertoire5
Je ne comprends pas très bien la forme à quel moment on met un + et doit-on afficher les fichiers non dossier ?

un petit “Hello, World!” en haskell[code]module Main where

main = putStrLn “Hello, World!”[/code]

[quote=“MisterFreez”]+_ repertoire1 |_ repertoire2 |+ repertoire3 ||_ sousRepertoire1 +_ repertoire4 +_ repertoire5
Je ne comprends pas très bien la forme à quel moment on met un + et doit-on afficher les fichiers non dossier ?[/quote]
La forme avec les plus c’était un exemple, si tu vois une autre manière de faire ça nous intéresse aussi.

@gege2061 : Tricheur :slightly_smiling: L’objectif n’est pas de choper des sources déjà faites mais de les faire soi-même sinon il n’y a aucun intérêt.

@MisterFreez : Comme le dis eol effectivement c’est un exemple et oui ce ne sont que les répertoires qui sont à afficher. Si tu as une autre idée d’affichage n’hésite pas l’objectif étant d’avoir le champ libre sur la conception et sur le langage à utiliser mais avec un algorithme simple de façon à ce que ce soit ludique. :wink:

@eol : Merci nickel, Bon reste à voir pour d’autres langages maintenant :smiley:

Salutations,

Je propose une première piste en Python pour l’exploration récursive des fichiers.
Évidemment, si vous avez d’autres modifications concernant l’indentation, n’hésitez pas à faire des propositions. (Et même si cela concerne autre choses d’ailleurs).

La fonction parcours prend comme argument un ‘int’ et renvoie un ‘int’, ce qui permet l’indentation.

Bien à vous tous.

[code]# -- coding:utf8 --

http://docs.python.org/library/os.html

http://docs.python.org/library/os.path.html

import os

def parcours(pos):
pos += 1
ls = os.listdir(os.getcwd()) # Equivalent ls;
ls.sort() # Tri alpha de la liste;

for element in ls:

    if os.path.isdir(element): 
        print("| "*(pos-1)+ "|-+ " + element) # Affichages des directories;
        os.chdir(element) # cd path;
        pos = parcours(pos)
        os.chdir('..') # cd .. ;
    
    # A activer si besoin d'afficher les files;
    #else:
    #    print("| "*(pos-1)+ "|- " + element) # Affichages des files;
        
pos -= 1
return pos

print “Chemin de base :”,os.getcwd()
position = 0
position = parcours(position)[/code]

[code]#include
#include

#include <sys/types.h>
#include <dirent.h>
#include <libgen.h>
#include <string.h>

namespace{
bool parcour(int level, std::string dossier){
using namespace std;
bool ret = false;
DIR *dos = opendir(dossier.c_str());
if(dos == NULL){
return ret;
}
struct dirent *entry;
while((entry = readdir(dos)) != NULL){
if(strcmp(entry->d_name,".") == 0 ||0 == strcmp(entry->d_name,"…")){
continue;
}
if(entry->d_type == 4){
if(!ret){
for(int i = 0; i < level;++i){
cout << ‘|’;
}
cout << "+ " << basename(&dossier[0]) << endl;

      ret = true;
    }
    parcour(level+1, dossier+'/'+entry->d_name);
  }
}
if(!ret){
  for(int i = 0; i < level;++i){
    cout << '|';
  }
  cout << "_ " << basename(&dossier[0]) << endl;
}
return ret;

}
}

int main (int argc, char ** argv){
using namespace std;

if(1 == argc){
cerr << “Usage : " << argv[0] << " …” << endl;
}

for(int i = 1; i < argc; ++i){
parcour(0, argv[i]);
}

return 0;
} // end of main()[/code]
Voici une version C++ (bien obligé d’utiliser du C malheureusement) qui affiche les dossiers de la forme :

+ . |_ coucou |+ test ||_ hello
une arborescence ./test/hello/ et ./couco/

Je vais regarder la version python.

[quote=“MisterFreez”]
Voici une version C++ (bien obligé d’utiliser du C malheureusement) qui affiche les dossiers de la [/quote]

Et quid de boost::filesystem ?

Pas eu envie d’introduire des dépendances (mais oui j’apprécie pas mal boost).

[code]#open “sys”;;
#open “unix”;;
#open “format”;;

let liste_repertoire s =
try let c = (opendir s) in
let res = ref [] in
let rec boucle () =
try (res:=(readdir c)::!res;boucle ()) with _-> ((closedir c);!res)
in boucle () with _ -> [];;

let affiche s =
let rec boucle preambule repcomplet = function
| “.” -> []
| “…” -> []
| rep -> (
print_string (preambule^"+ “^rep);
print_newline ();
(flat_map
(function x -> (boucle (preambule^” |") (repcomplet^"/"^x) x))
(liste_repertoire repcomplet))
) in boucle “” s s;;

if (vect_length sys__command_line) >= 2
then affiche sys__command_line.(1)
else affiche “./”;;
[/code]
cela donne

[code]francois@bling:/tmp$ ./affiche /tmp

  • /tmp
    |+ clamav_0.95.3+dfsg.orig.tar.gz
    |+ .X0-lock
    |+ clamav_0.95.3+dfsg-1.dsc
    |+ clamav-0.95.3+dfsg
    | |+ freshclam
    | | |+ dns.c
    | | |+ manager.c
    | | |+ notify.h
    | | |+ Makefile.am
    | | |+ manager.h
    | | |+ mirman.c
    | | |+ notify.c
    | | |+ nonblock.c
    | | |+ execute.h
    | | |+ nonblock.h
    | | |+ execute.c
    | | |+ freshclam.c
    | | |+ Makefile.in
    | | |+ dns.h
    | | |+ mirman.h
    […]
    [/code]

Bonjour,

Une autre façon de faire en C:

#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

int select_dir (const struct dirent *adir)
{
	if ((strcmp(adir->d_name, ".."))
		&&(strcmp(adir->d_name, ".")))
		return 1;
	else
		return 0;
}

void see_dir (char *adir)
{
	struct dirent **namelist;
	int n;
	char *path;

	n = scandir(adir, &namelist, select_dir, alphasort);
	if (n > 0)
	{
		while(n--)
		{
			asprintf(&path, "%s/%s", adir, namelist[n]->d_name);
			printf("%s\n" ,path);
			see_dir(path);
			free (path);
			free (namelist [n]);
		}
		free (namelist);
	}
}

main(int argc , char *argv[])
{
	if (argc != 2)
	{
		printf("Usage: %s dir\n", argv[0]);
		exit(0);
	}else
	see_dir(argv[1]);
}

cela donne:

user1@PC1:~/Projets$ readdir U-boot
U-boot/tools
U-boot/tools/updater
U-boot/tools/updater/utils.c
U-boot/tools/updater/update.c
U-boot/tools/updater/string.c
U-boot/tools/updater/ppcstring.S
U-boot/tools/updater/junk
U-boot/tools/updater/flash_hw.c
U-boot/tools/updater/flash.c
U-boot/tools/updater/dummy.c
U-boot/tools/updater/ctype.c
U-boot/tools/updater/cmd_flash.c
U-boot/tools/updater/Makefile
U-boot/tools/scripts
U-boot/tools/scripts/send_image
U-boot/tools/scripts/send_cmd
U-boot/tools/scripts/flash_param
U-boot/tools/scripts/dot.kermrc
U-boot/tools/scripts/README
U-boot/tools/mkimage.c
U-boot/tools/logos
...

:smt111

Un peu de PERL pour changer :stuck_out_tongue:

#!/usr/bin/perl -w

use strict;
use warnings;

my $baseindent = "";
my $addint = "  ";

sub make_dirpath($){
	my ($dirpath) = @_;
	if($dirpath){
		#ajout '/' de fin si absent	
		if ( $dirpath !~ /^.*\/$/) {
			$dirpath.="/";
		}
	}else{
		#chaîne vide si on ne précise rien
		$dirpath = "";
	}
	#on remplace les noms de dossiers avec des espaces par des espace échappés :	
	$dirpath =~ s/ /\\ /g;
	return $dirpath;
}

sub cycle_dir($;$);#récursion cycle_dir
sub cycle_dir($;$){
	my ($dirpath, $indents) = @_;
	
	$dirpath = make_dirpath($dirpath);#mise en forme nom dossier
	
	#itération sur les éléments du dossier	
	my @files = <$dirpath*>;
	foreach my $file (@files) {
		if(-d$file){
			print $indents.'+'.$file . "\n";#dossier
			cycle_dir($file,$indents.$addint);#si dossier : rebelotte avec indent en +
		} else {
			print $indents.'|_'.$file . "\n";#simple fichier
		}
	}
}

#on liste les éléments du nom de dossier passé en paramètre
cycle_dir($ARGV[0], $baseindent);

Sans doute pas optimal m’enfin ça fait ce qu’on lui demande ou du moins ça s’en rapproche :

/home/martin >>> % ./dirlist.pl /proc/acpi/
+/proc/acpi/button
  +/proc/acpi/button/lid
    +/proc/acpi/button/lid/LID
      |_/proc/acpi/button/lid/LID/info
      |_/proc/acpi/button/lid/LID/state
  +/proc/acpi/button/power
    +/proc/acpi/button/power/PBTN
      |_/proc/acpi/button/power/PBTN/info
  +/proc/acpi/button/sleep
    +/proc/acpi/button/sleep/SBTN
      |_/proc/acpi/button/sleep/SBTN/info
|_/proc/acpi/dsdt
+/proc/acpi/embedded_controller
|_/proc/acpi/fadt
+/proc/acpi/fan
|_/proc/acpi/info
+/proc/acpi/power_resource
+/proc/acpi/processor
  +/proc/acpi/processor/CPU0
    |_/proc/acpi/processor/CPU0/info
    |_/proc/acpi/processor/CPU0/limit
    |_/proc/acpi/processor/CPU0/power
    |_/proc/acpi/processor/CPU0/throttling
  +/proc/acpi/processor/CPU1
    |_/proc/acpi/processor/CPU1/info
    |_/proc/acpi/processor/CPU1/limit
    |_/proc/acpi/processor/CPU1/power
    |_/proc/acpi/processor/CPU1/throttling
|_/proc/acpi/sleep
+/proc/acpi/thermal_zone
  +/proc/acpi/thermal_zone/THM
    |_/proc/acpi/thermal_zone/THM/cooling_mode
    |_/proc/acpi/thermal_zone/THM/polling_frequency
    |_/proc/acpi/thermal_zone/THM/state
    |_/proc/acpi/thermal_zone/THM/temperature
    |_/proc/acpi/thermal_zone/THM/trip_points
+/proc/acpi/video
  +/proc/acpi/video/VID
    +/proc/acpi/video/VID/CRT
      |_/proc/acpi/video/VID/CRT/brightness
      |_/proc/acpi/video/VID/CRT/EDID
      |_/proc/acpi/video/VID/CRT/info
      |_/proc/acpi/video/VID/CRT/state
    |_/proc/acpi/video/VID/DOS
    +/proc/acpi/video/VID/DVI
      |_/proc/acpi/video/VID/DVI/brightness
      |_/proc/acpi/video/VID/DVI/EDID
      |_/proc/acpi/video/VID/DVI/info
      |_/proc/acpi/video/VID/DVI/state
    |_/proc/acpi/video/VID/info
    +/proc/acpi/video/VID/LCD
      |_/proc/acpi/video/VID/LCD/brightness
      |_/proc/acpi/video/VID/LCD/EDID
      |_/proc/acpi/video/VID/LCD/info
      |_/proc/acpi/video/VID/LCD/state
    |_/proc/acpi/video/VID/POST
    |_/proc/acpi/video/VID/POST_info
    |_/proc/acpi/video/VID/ROM
    +/proc/acpi/video/VID/TV
      |_/proc/acpi/video/VID/TV/brightness
      |_/proc/acpi/video/VID/TV/EDID
      |_/proc/acpi/video/VID/TV/info
      |_/proc/acpi/video/VID/TV/state
  +/proc/acpi/video/VID2
    |_/proc/acpi/video/VID2/DOS
    |_/proc/acpi/video/VID2/info
    |_/proc/acpi/video/VID2/POST
    |_/proc/acpi/video/VID2/POST_info
    |_/proc/acpi/video/VID2/ROM
|_/proc/acpi/wakeup

Tiens faudrait que je sépare complètement dossiers et fichiers pour que ça soit moins le boxon ou alors carrément n’afficher que les dossiers pour pas se prendre la tete :stuck_out_tongue:

Un langage que j’apprécie beaucoup: Objective C

Adir.h:

#import <objc/Object.h> 
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

#define TYPEDIR		1
#define TYPEFILE	2

extern int offset;

@interface Adir : Object 
{
	struct dirent **namelist;
	int n;
	int count;
	char *path;
}
- free;
- (int) set_Entry: (char*) dirname;
- (int) set_next;
- (int) get_count;
- (char*) get_name;
- (int) get_type;
@end

Adir.m:

#import "Adir.h"

int select_dir (const struct dirent *adir)
{
	//if ((adir->d_type == DT_DIR) 
	if ((strcmp(adir->d_name, ".."))
		&&(strcmp(adir->d_name, ".")))
		return 1;
	else
		return 0;
}

@implementation Adir
+ new   
{
  self = [super new];
  return self;
} 
- free
{
	while(count--) free (namelist [count]);
	free (namelist);
  return [super free];
} 
- (int) set_Entry: (char*) dirname
{
	n = scandir(dirname, &namelist, select_dir, alphasort);
	count = n;
	return count;
}
- (int) set_next
{
	return --n;
}

- (int) get_count
{
	return n;
}
- (char*) get_name
{
	if (n>0)	
		return namelist[n-1]->d_name;
	else
		return (char *)0;
}
- (int) get_type
{
	if (namelist[n-1]->d_type == DT_DIR) return TYPEDIR;
	return TYPEFILE;
}
@end

Readdir.h:

#import <objc/Object.h> 
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

@interface Readdir : Object 
{
  char *path;          // These are instance variables.
  int size;
} 
/* Public methods */
- free;
- Entry: (char *) dirname;
- scan; 
@end

Readdir.m:

#import "Adir.h"
#import "Readdir.h" 

@implementation Readdir 
+ new   
{
  self = [super new];
  return self;
} 
- free
{
  free(path);
  return [super free];
} 
- Entry: (char *) dirname
{
	asprintf(&path, "%s", dirname);
  
  return self;
} 
- scan
{
  id adir;
  id subdir;
  char *subpath;

  adir = [Adir new];     
  [adir set_Entry:path]; 
  
  while([adir get_count])
  {	
	int i;

	for (i=0; i<offset; i++) printf("|  ");
	

	if ([adir get_type] == TYPEDIR)
	{
		printf("|+ %s\n", [adir get_name]);
		offset++;		
		subdir = [Readdir new];    
		asprintf(&subpath, "%s/%s", path, [adir get_name]); 
		[subdir Entry: subpath];   
		[subdir scan];
		[subdir free];
		free (subpath);
		offset--;
	}else
		printf("|_ %s\n", [adir get_name]);
	[adir set_next];
  }
 
	[adir free];
  return self;                
} 
@end

main.m:

#import <objc/Object.h>
#import "Readdir.h"  
 
int offset;
     
main(int argc, char* argv[], char** env)
{
  int i;
  id readdir; 

  offset = 0;

  if (argc != 2)
  {
	printf("Usage: %s dir\n", argv[0]);
	exit(0);
  }
       
  readdir = [Readdir new];     
  [readdir Entry: argv[1]];   
  [readdir scan];
  [readdir free];
}

A compiler avec :

make -n :
gcc -o Adir.o -c Adir.m -Wno-import -I/usr/lib/gcc/x86_64-linux-gnu/4.3/include/
gcc -o main.o -c main.m -Wno-import -I/usr/lib/gcc/x86_64-linux-gnu/4.3/include/
gcc -o Readdir.o -c Readdir.m -Wno-import -I/usr/lib/gcc/x86_64-linux-gnu/4.3/include/
gcc -lobjc -lpthread -o readdir.objc Adir.o main.o Readdir.o -L/usr/lib/gcc/x86_64-linux-gnu/4.3/

(à adapter _64…)

Résultat:

|+ tools
|  |+ updater
|  |  |_ utils.c
|  |  |_ update.c
|  |  |_ string.c
|  |  |_ ppcstring.S
|  |  |_ junk
|  |  |_ flash_hw.c
|  |  |_ flash.c
|  |  |_ dummy.c
|  |  |_ ctype.c
|  |  |_ cmd_flash.c
|  |  |_ Makefile
|  |+ scripts
|  |  |_ send_image
|  |  |_ send_cmd
|  |  |_ flash_param
|  |  |_ dot.kermrc
|  |  |_ README
|  |_ mkimage.c
|  |+ logos
|  |  |_ denx.bmp
|  |_ inca-swap-bytes.c
|  |_ img2srec.c
|  |_ gen_eth_addr.c
|  |+ gdb
|  |  |_ serial.h
|  |  |_ serial.c
|  |  |_ remote.h

:smt111 (j’aime bien ce smiley, merci aux administrateurs. :smt038 ).

J’avais fait ma version python, et puis j’ai reçu un coup de fil, et puis vapula a posté la sienne… argh :smt003

Bref je vous la mets quand même :

[code]#!/usr/bin/env python

-- coding:utf-8 --

import os

def foo(folder, tabs=0):
files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder,f))]
dirs = [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder,d))]
for f in files:
print ’ ’ * tabs + ‘|-’ + f
for d in dirs:
print ’ ’ * tabs + ‘+’ + d
foo(os.path.join(folder,d), tabs+1)

def main():
foo(os.getcwd())
return 0

if name == ‘main’: main()[/code]

Résultat dans le dossier de test :

 |-test.pyc
 |-test.py
 +test
  |-truc
  |-chose
  +machin
   |-bidule

[code]#open “sys”;;
#open “unix”;;
#open “format”;;

let liste_repertoire s =
try let c = (opendir s) in
let res = ref [] in
let rec boucle () =
try (res:=(readdir c)::!res;boucle ()) with _-> ((closedir c);!res)
in boucle () with _ -> [];;

let est_repertoire s = try let c = (opendir s) in ((closedir c);true)
with _ -> false;;

let affiche s =
let rec boucle preambule repcomplet = function
| “.” -> []
| “…” -> []
| rep when (est_repertoire rep) -> (
print_string (preambule^"+ “^rep);
print_newline ();
(flat_map
(function x -> (boucle (preambule^” |") (repcomplet^"/"^x) x))
(liste_repertoire repcomplet))
)
| fic -> (print_string (preambule^"_ "^fic));[print_newline ()]
in boucle “” s s;;

if (vect_length sys__command_line) >= 2
then affiche sys__command_line.(1)
else affiche “./”;;
[/code]
qui affiche

+ ./ |_ clamav_0.95.3+dfsg.orig.tar.gz |_ .X0-lock |_ clamav_0.95.3+dfsg-1.dsc |+ clamav-0.95.3+dfsg | |_ freshclam | |_ FAQ | |_ shared | |_ COPYING | |_ test | |_ clamd | |_ COPYING.sha256 | |_ NEWS
synthétique Caml, non?

Oui, et il paraît beaucoup plus claire et simple que le code utilisé par Dixippe :unamused:

Le caml est un langage interprété?? donc un langage de script??

Dixippe, je ne me permettrait surtout pas de critiquer quoique que ce soit sur ton code ou ta manière de coder (je n’ai aucune connaissance en prog’, malheureusement)
mais force est de constater que ton code est très verbeux comparé à celui de fran.b même si on ne peut pas le comparer

Tu utilises le Objective C = Objective Caml?? C’est parce qu’il est orienté objet qu’il paraît aussi compliqué et verbeux??

Objective C n’est pas OCaml, même si les syntaxes peuvent se ressembler. OCaml “rajoute” les objets a Caml à très peu de choses près.

Caml / OCaml est hypersynthétique c’est sur mais il faut être à l’aise avec et tout l’aspect “prog fonctionnelle” qui va avec je trouve. Mais c’est clair que c’est un super langage.

Par contre M3T4 Caml / OCaml se compile, tu as un compilo tout comme gcc : ocamlc, avec typage statique et tout et tout. Et d’ailleurs en général quand ocamlc termine correctement, c’est soit qu’on a correctement typé son bazar, soit qu’on a cherché à “tricher” et ce de façon très vicieuse ^^.^Enfin les souvenirs que j’en ai c’est que ) côté les options “–pedantic -Wall -Werror […]” qu’on peut trouver dans gcc produisent à peu près le même effet une fois toutes cummulées. Un truc très “marrant” à tenter pour bien s’en rendre compte est de faire une erreur de typage avec un framework Ocaml comme Oxygen.

Un truc génial dans Ocaml aussi je trouve c’est la façon de traiter les variables en écrivant des conjonctions (un peu comme un gros switch) … y’a pas mal de choses sympa dans Caml mais je n’ai fait que l’effleurer mais j’y remettrais ptet mes gros doigts boudinés un de ces 4 :stuck_out_tongue:

Ceci dit fran, je ne sais pas ce que tu en penses mais perso j’ai découvert PERL en stage et je le trouve fort sympatique aussi =). L’article wikipedia dessus le désigne comme la “tronçonneuse suisse des langages de programmation” et en un sens je suis assez d’accord, rien que pour la gestion “gratuite” des listes et des hashtables :stuck_out_tongue: Ceci dit il me semble qu’il en va de même pour Ocaml, c’est plus dans la façon de concevoir le programme que l’on change d’approche au final.

:cry:

Pour me faire pardonner, voici le code dans deux langages différents :smiley:

Vala :

[code]void print_tabs (int tabs)
{
for (int i = 0; i < tabs; i++)
{
print (" ");
}
}

void foo (string folder, int tabs = 0)
{
Dir dir;
string file;
string filename;

dir = Dir.open (folder);
while ((filename = dir.read_name ()) != null)
{
file = Path.build_filename (folder, filename);
print_tabs (tabs);
if (!FileUtils.test (file, FileTest.IS_DIR))
{
print ("|-%s\n", filename);
}
else
{
print ("+%s\n", filename);
foo (filename, tabs+1);
}
}
}

void main ()
{
foo (".");
}[/code]

genie :

[code][indent=2]

def print_tabs (tabs : int) : void
for var i = 1 to tabs
stdout.printf (" ")

def foo (folder : string, tabs : int = 0) : void
dir : Dir
file : string
filename : string

dir = Dir.open (folder)
while (filename = dir.read_name ()) != null
file = Path.build_filename (folder, filename)
print_tabs (tabs)
if !FileUtils.test (file, FileTest.IS_DIR)
print “|-%s”, filename
else
print “+%s”, filename
foo (filename, tabs+1)

init
foo (".")[/code]

Même code que ma version C++, mais en Java. L’API File de java est vraiment agréable à utiliser.

[code]import java.io.File;

class Rep{
private static void recurs(int level, String dossier){
boolean ret = false;
File dos = new File(dossier);

if(!dos.exists() || !dos.isDirectory()){
  return;
}

for(File file: dos.listFiles()){
  if(file.getName().compareTo(".") == 0 || file.getName().compareTo("..") == 0){
    continue;
  }
  if(file.isDirectory()){
    if(!ret){
      for(int i = 0; i < level; ++i){
        System.out.print('|');
      }
      System.out.println("+ "+dos.getName());

      ret = true;
    }
    recurs(level+1, dossier+'/'+file.getName());
  }
}
if(!ret){
  for(int i = 0; i < level;++i){
    System.out.print('|');
  }
  System.out.println("_ "+dos.getName());
}

}

public static void main(String[] arg){
if(arg.length == 0){
System.out.println(“Le programme a besoin d’argument.\n”);
return;
}

for(String dossier : arg){
  recurs(0, dossier);
}

}
}[/code]
J’zi vraiment pas le temps de regarder les algo et astuces que vous utilisez dans les autres langages. J’espère avoir plus de temps ce week end.