Quel outil utiliser pour dessiner un diagramme d’arborescence de fichiers

Étant donné une arborescence de fichiers – un répertoire contenant des répertoires, etc., comment écririez-vous un script pour créer un diagramme de l’arborescence de fichiers en tant que fichier graphique que je peux incorporer dans un document de traitement de texte. Je préfère les fichiers vectoriels (SVG, EPS, EMF …). L’outil doit fonctionner sur Windows, mais de préférence sur plusieurs plates-formes. L’outil peut être commercial mais de préférence gratuit.

Mise à jour 2012-02-20. La question était liée à un sous-projet de documentation. J’ai dû expliquer où les fichiers (en particulier les ressources et les fichiers de configuration) résident. Je me suis retrouvé avec l’utilisation de la commande dos tree. J’ai à la fois saisi le résultat (pour les dossiers courts) ET pour les dossiers plus longs, j’ai redirigé vers un fichier texte, que j’ai ensuite édité. Par exemple, si un sous-dossier contenait 20 fichiers de type similaire qui, individuellement, n’étaient pas importants au point que je faisais, je n’en ai laissé que deux et j’ai remplacé le rest par une ligne. J’ai ensuite imprimé le fichier pour consoler à nouveau et l’écran l’a saisi. Avant de saisir l’écran, je devais modifier la couleur de premier plan en noir et la couleur d’arrière-plan en blanc, pour mieux paraître et économiser de l’encre dans un document qui devrait être imprimé.

Il est très surprenant qu’il n’y ait pas de meilleur outil pour cela. Si j’avais le temps, j’écrirais une extension Visio ou une ligne de commande qui produirait du SVG. Le format SVG étant HTML5 inférieur à la norme, permettrait même une inclusion sans douleur dans la documentation en ligne.

Mise à jour 2017-10-17. Je suis désolé que cette question a été supprimée comme n’appartenant pas à SO. Je l’ai donc reformulé. J’ai besoin d’un script – pas un WYSIWYG aussi. Donc, tout langage de script ou bibliothèque est correct. Donc, c’est une question de codage, et je crois que cela appartient à SO.

    Copier et coller à partir de la commande d’ tree MS-DOS peut également fonctionner pour vous. Exemples:

    arbre

     C:\Foobar>tree C:. ├───FooScripts ├───barconfig ├───Baz │ ├───BadBaz │ └───Drop ... 

    arbre / F

     C:\Foobar>tree C:. ├───FooScripts │ foo.sh ├───barconfig │ bar.xml ├───Baz │ ├───BadBaz │ │ badbaz.xml │ └───Drop ... 

    arbre / A

     C:\Foobar>tree /A C:. +---FooScripts +---barconfig +---Baz ¦ +---BadBaz ¦ \---Drop ... 

    arbre / F / A

     C:\Foobar>tree /A C:. +---FooScripts ¦ foo.sh +---barconfig ¦ bar.xml +---Baz ¦ +---BadBaz ¦ ¦ badbaz.xml ¦ \---Drop ... 

    Syntaxe [ source ]

    tree [ drive: ] [ path ] [ /F ] [ /A ]

    drive:\path – Lecteur et répertoire contenant un disque pour afficher la structure des répertoires, sans lister les fichiers.

    /F – Inclut tous les fichiers présents dans chaque répertoire.

    /A – Remplace les caractères graphiques utilisés pour lier les lignes par des caractères ext au lieu de caractères graphiques. /a est utilisé avec les pages de code qui ne prennent pas en charge les caractères graphiques et pour envoyer la sortie aux imprimantes qui n’interprètent pas correctement les caractères graphiques.

    Graphviz – à partir de la page Web:

    Les programmes de mise en page Graphviz prennent des descriptions de graphiques dans un langage de texte simple et créent des diagrammes dans plusieurs formats utiles tels que des images et des SVG pour les pages Web, Postscript pour les inclure dans PDF ou d’autres documents; ou afficher dans un navigateur graphique interactif. (Graphviz prend également en charge GXL, un dialecte XML.)

    C’est l’outil le plus simple et le plus productif que j’ai trouvé pour créer divers diagrammes de boîtes et de lignes. J’ai et utilise Visio et OmniGraffle, mais il y a toujours la tentation de faire “juste un ajustement de plus”.

    Il est également assez facile d’écrire du code pour produire le format “fichier de points” utilisé par Graphiz, de sorte que la production de diagrammes automatisés est également à scope de main.

    Comme promis, voici ma version du Caire. Je l’ai écrit avec Lua, en utilisant lfs pour parcourir les répertoires. J’adore ces petits défis, car ils me permettent d’explorer les API que je voulais explorer depuis longtemps …
    lfs et LuaCairo sont tous deux multi-plateformes, il devrait donc fonctionner sur d’autres systèmes (testés sur le français WinXP Pro SP3).

    J’ai fait une première version en dessinant des noms de fichiers pendant que je marchais dans l’arbre. Avantage: pas de surcharge de mémoire. Inconvénient: je dois spécifier la taille de l’image à l’avance, donc les listes risquent d’être coupées.

    J’ai donc fait cette version, en parcourant d’abord l’arborescence des répertoires, en la stockant dans une table Lua. Puis, connaissant le nombre de fichiers, créer le canevas à ajuster (au moins verticalement) et dessiner les noms.
    Vous pouvez facilement basculer entre le rendu PNG et le format SVG. Problème avec ce dernier: Cairo le génère à un niveau bas, dessinant les lettres au lieu d’utiliser la capacité de texte de SVG. Eh bien, au moins, il garantit un rendu précis, même sur les systèmes sans police. Mais les fichiers sont plus gros … Pas vraiment de problème si vous le compressez après, pour avoir un fichier .svgz.
    Ou il ne devrait pas être trop difficile de générer le SVG directement, j’ai utilisé Lua pour générer du SVG dans le passé.

     -- LuaFileSystem  require"lfs" -- LuaCairo  require"lcairo" local CAIRO = cairo local PI = math.pi local TWO_PI = 2 * PI --~ local dirToList = arg[1] or "C:/PrgCmdLine/Graphviz" --~ local dirToList = arg[1] or "C:/PrgCmdLine/Tecgraf" local dirToList = arg[1] or "C:/PrgCmdLine/tcc" -- Ensure path ends with / dirToList = ssortingng.gsub(dirToList, "([^/])$", "%1/") print("Listing: " .. dirToList) local fileNb = 0 --~ outputType = 'svg' outputType = 'png' -- dirToList must have a trailing slash function ListDirectory(dirToList) local dirListing = {} for file in lfs.dir(dirToList) do if file ~= ".." and file ~= "." then local fileAttr = lfs.atsortingbutes(dirToList .. file) if fileAttr.mode == "directory" then dirListing[file] = ListDirectory(dirToList .. file .. '/') else dirListing[file] = "" end fileNb = fileNb + 1 end end return dirListing end --dofile[[../Lua/DumpObject.lua]] -- My own dump routine local dirListing = ListDirectory(dirToList) --~ print("\n" .. DumpObject(dirListing)) print("Found " .. fileNb .. " files") --~ os.exit() -- Constants to change to adjust aspect local initialOffsetX = 20 local offsetY = 50 local offsetIncrementX = 20 local offsetIncrementY = 12 local iconOffset = 10 local width = 800 -- Still arbitrary local titleHeight = width/50 local height = offsetIncrementY * (fileNb + 1) + titleHeight local outfile = "CairoDirTree." .. outputType local ctxSurface if outputType == 'svg' then ctxSurface = cairo.SvgSurface(outfile, width, height) else ctxSurface = cairo.ImageSurface(CAIRO.FORMAT_RGB24, width, height) end local ctx = cairo.Context(ctxSurface) -- Display a file name -- file is the file name to display -- offsetX is the indentation function DisplayFile(file, bIsDir, offsetX) if bIsDir then ctx:save() ctx:select_font_face("Sans", CAIRO.FONT_SLANT_NORMAL, CAIRO.FONT_WEIGHT_BOLD) ctx:set_source_rgb(0.5, 0.0, 0.7) end -- Display file name ctx:move_to(offsetX, offsetY) ctx:show_text(file) if bIsDir then ctx:new_sub_path() -- Position independent of latest move_to -- Draw arc with absolute coordinates ctx:arc(offsetX - iconOffset, offsetY - offsetIncrementY/3, offsetIncrementY/3, 0, TWO_PI) -- Violet disk ctx:set_source_rgb(0.7, 0.0, 0.7) ctx:fill() ctx:restore() -- Restore original settings end -- Increment line offset offsetY = offsetY + offsetIncrementY end -- Erase background (white) ctx:set_source_rgb(1.0, 1.0, 1.0) ctx:paint() --~ ctx:set_line_width(0.01) -- Draw in dark blue ctx:set_source_rgb(0.0, 0.0, 0.3) ctx:select_font_face("Sans", CAIRO.FONT_SLANT_NORMAL, CAIRO.FONT_WEIGHT_BOLD) ctx:set_font_size(titleHeight) ctx:move_to(5, titleHeight) -- Display title ctx:show_text("Directory tree of " .. dirToList) -- Select font for file names ctx:select_font_face("Sans", CAIRO.FONT_SLANT_NORMAL, CAIRO.FONT_WEIGHT_NORMAL) ctx:set_font_size(10) offsetY = titleHeight * 2 -- Do the job function DisplayDirectory(dirToList, offsetX) for k, v in pairs(dirToList) do --~ print(k, v) if type(v) == "table" then -- Sub-directory DisplayFile(k, true, offsetX) DisplayDirectory(v, offsetX + offsetIncrementX) else DisplayFile(k, false, offsetX) end end end DisplayDirectory(dirListing, initialOffsetX) if outputType == 'svg' then cairo.show_page(ctx) else --cairo.surface_write_to_png(ctxSurface, outfile) ctxSurface:write_to_png(outfile) end ctx:destroy() ctxSurface:destroy() print("Found " .. fileNb .. " files") 

    Bien sûr, vous pouvez changer les styles. Je n’ai pas dessiné les lignes de connexion, je ne l’ai pas vu comme nécessaire. Je pourrais les append éventuellement plus tard.

    Pourquoi ne pourriez-vous pas simplement créer une structure de fichier sur le système de fichiers Windows et la remplir avec les noms de votre choix, puis utiliser une capture d’écran comme HyperSnap (ou Alt-PrtScr omniprésent) pour capturer une section de la fenêtre Explorer.

    Je l’ai fait lors de la «démo» d’une application Internet qui aurait des sections réductibles, je devais juste créer des fichiers qui ressemblaient à mes entrées souhaitées.

    HyperSnap donne au moins aux JPGs (probablement d’autres mais je n’ai jamais pris la peine d’enquêter).

    Ou vous pourriez capturer les icons +/- à partir d’Explorer et les utiliser dans MS Word Draw pour réaliser votre image, mais je n’ai jamais réussi à faire en sorte que MS Word Draw se comporte correctement.

    Le conseil d’utilisation de Graphviz est bon: vous pouvez générer le fichier de points et faire le dur travail de mesure des chaînes, de la mise en page, etc. De plus, il peut afficher les graphiques dans de nombreux formats, y compris ceux vectoriels.

    C’est ce que j’ai trouvé dans un programme de diffusion, mais je ne peux pas le retrouver! J’ai copié le fichier d’exemple et l’ai étudié, car je ne connais pas beaucoup cette syntaxe déclarative et je voulais en apprendre un peu plus.

    Problème: avec la dernière version de Graphviz, j’ai des erreurs (ou plutôt des avertissements, car le diagramme final est généré), à la fois dans le graphique d’origine et dans celui que j’ai écrit (à la main). Certaines recherches montrant cette erreur ont été trouvées dans les anciennes versions et ont disparu dans les versions plus récentes. On dirait qu’il est de retour.

    Je donne toujours le fichier, peut-être que cela peut être un sharepoint départ pour quelqu’un, ou peut-être que cela suffit à vos besoins (bien sûr, vous devez toujours le générer).

     digraph tree { rankdir=LR; DirTree [label="Directory Tree" shape=box] a_Foo_txt [shape=point] f_Foo_txt [label="Foo.txt", shape=none] a_Foo_txt -> f_Foo_txt a_Foo_Bar_html [shape=point] f_Foo_Bar_html [label="Foo Bar.html", shape=none] a_Foo_Bar_html -> f_Foo_Bar_html a_Bar_png [shape=point] f_Bar_png [label="Bar.png", shape=none] a_Bar_png -> f_Bar_png a_Some_Dir [shape=point] d_Some_Dir [label="Some Dir", shape=ellipse] a_Some_Dir -> d_Some_Dir a_VBE_C_reg [shape=point] f_VBE_C_reg [label="VBE_C.reg", shape=none] a_VBE_C_reg -> f_VBE_C_reg a_P_Folder [shape=point] d_P_Folder [label="P Folder", shape=ellipse] a_P_Folder -> d_P_Folder a_Processing_20081117_7z [shape=point] f_Processing_20081117_7z [label="Processing-20081117.7z", shape=none] a_Processing_20081117_7z -> f_Processing_20081117_7z a_UsefulBits_lua [shape=point] f_UsefulBits_lua [label="UsefulBits.lua", shape=none] a_UsefulBits_lua -> f_UsefulBits_lua a_Graphviz [shape=point] d_Graphviz [label="Graphviz", shape=ellipse] a_Graphviz -> d_Graphviz a_Tree_dot [shape=point] f_Tree_dot [label="Tree.dot", shape=none] a_Tree_dot -> f_Tree_dot { rank=same; DirTree -> a_Foo_txt -> a_Foo_Bar_html -> a_Bar_png -> a_Some_Dir -> a_Graphviz [arrowhead=none] } { rank=same; d_Some_Dir -> a_VBE_C_reg -> a_P_Folder -> a_UsefulBits_lua [arrowhead=none] } { rank=same; d_P_Folder -> a_Processing_20081117_7z [arrowhead=none] } { rank=same; d_Graphviz -> a_Tree_dot [arrowhead=none] } } > dot -Tpng Tree.dot -o Tree.png Error: lost DirTree a_Foo_txt edge Error: lost a_Foo_txt a_Foo_Bar_html edge Error: lost a_Foo_Bar_html a_Bar_png edge Error: lost a_Bar_png a_Some_Dir edge Error: lost a_Some_Dir a_Graphviz edge Error: lost d_Some_Dir a_VBE_C_reg edge Error: lost a_VBE_C_reg a_P_Folder edge Error: lost a_P_Folder a_UsefulBits_lua edge Error: lost d_P_Folder a_Processing_20081117_7z edge Error: lost d_Graphviz a_Tree_dot edge 

    Je vais essayer une autre direction, en utilisant Cairo, qui est également capable d’exporter un certain nombre de formats. C’est plus de travail (positions / compensations de calcul) mais la structure est simple, ne devrait pas être trop difficile.