Quel outil utiliser pour dessiner un diagramme d'arborescence de fichiers [fermé]

Donné une arborescence de fichiers - un répertoire avec des répertoires etc, comment voulez-vous écrire un script pour créer un diagramme du fichier de l'arborescence d'un fichier graphique que je peux intégrer dans un document de traitement de texte. Je préfère vector (SVG, EPS, EMF...) fichier. L'outil doit fonctionner sur Windows, mais de préférence multi-plateforme. 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. Je devais expliquer où les fichiers (en particulier les ressources et fichiers de configuration) résident. J'ai fini par utiliser la commande dos tree. J'ai tous deux 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 typés de la même manière qui n'étaient pas importants au point que je faisais, j'en ai laissé deux et remplacé le reste par un ... ligne. J'ai ensuite imprimé le fichier pour console à nouveau et l'écran l'a saisi. Avant de saisir l'écran j'ai dû modifier le premier plan couleur au noir et la couleur de fond au blanc, pour mieux paraître et économiser de l'encre dans un document 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 peut-être une ligne de commande qui produit SVG. SVG étant HTML5 de qualité inférieure, permettrait même une inclusion indolore dans la documentation en ligne.

Mise à jour 2017-10-17. Je suis désolé que cette question ait été supprimée comme n'appartenant pas à SO. J'ai donc ré-exprimé. J'ai besoin d'un script-pas un WYSIWYG aussi. Donc, n'importe quel langage de script ou Bibliothèque est ok. C'est donc une question d'écriture de code, et je crois appartient à SO.

65
demandé sur Michael 2008-12-07 16:01:18

5 réponses

Copier et coller à partir de la commande MS-DOS tree 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 /Un

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 le disque pour l'affichage de la structure de répertoire, sans lister les fichiers.

/F - Inclure tous les fichiers dans chaque répertoire.

/A - remplacez les caractères graphiques utilisés pour lier des lignes par des caractères ext, au lieu de caractères graphiques. {[13] } 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.

72
répondu svinto 2017-10-25 14:44:23

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 font des diagrammes dans plusieurs formats utiles tels que des images et SVG pour les pages web, Postscript pour l'inclusion 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 une variété de diagrammes de boîtes et de lignes. Je avoir et utiliser 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 "dot file" que Graphiz consomme, donc la production automatisée de diagrammes est également à portée de main.

18
répondu joel.neely 2008-12-07 13:25:00

Comme promis, voici ma version du Caire. Je l'ai scripté 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 creuser depuis un certain temps...
lfs et LuaCairo sont tous deux multiplateformes, il devrait donc fonctionner sur d'autres systèmes (testé sur WinXP Pro SP3 Français).

J'ai fait une première version dessinant des noms de fichiers en marchant dans l'arbre. Avantage: Pas de frais généraux de mémoire. Inconvénient: je dois spécifier la taille de l'image au préalable, donc les listes sont susceptibles d'être coupé.

J'ai donc créé cette version, en parcourant d'abord l'arborescence des répertoires, en la stockant dans une table Lua. Ensuite, connaissant le nombre de fichiers, créant le canevas pour s'adapter (au moins verticalement) et dessinant les noms.
Vous pouvez facilement basculer entre le rendu PNG et SVG one. Problème avec ce dernier: Cairo Le génère à bas niveau, en 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 la police. Mais les fichiers sont plus gros... Pas vraiment un problème si vous compressez après, d'avoir une .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 SVG dans le passé.

-- LuaFileSystem <http://www.keplerproject.org/luafilesystem/>
require"lfs"
-- LuaCairo <http://www.dynaset.org/dogusanh/>
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 = string.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.attributes(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 ajouter éventuellement plus tard.

5
répondu PhiLho 2008-12-09 00:39:21

Pourquoi ne pas créer une structure de fichier sur le système de fichiers Windows et la remplir avec les noms souhaités, puis utiliser un grabber d'écran comme HyperSnap (ou l'omniprésent Alt-PrtScr) pour capturer une section de la fenêtre de L'Explorateur.

Je l'ai fait quand 'demoing' une application internet qui aurait des sections pliables, je devais juste créer des fichiers qui ressemblaient à mes entrées souhaitées.

HyperSnap donne au moins des JPG (probablement d'autres mais je n'ai jamais pris la peine de le faire enquêter).

Ou vous pouvez capturer les icônes +/- de L'explorateur et les utiliser dans MS Word Draw lui-même pour faire votre image, mais je n'ai jamais été en mesure D'obtenir MS Word Draw pour se comporter correctement.

3
répondu paxdiablo 2008-12-07 13:23:44

Le Conseil d'utiliser Graphviz est bon: vous pouvez générer le fichier dot et il fera le travail difficile de mesurer les chaînes, de faire la mise en page, etc. De plus, il peut produire les graphiques dans beaucoup de formats, y compris les vectoriels.

J'ai trouvé un programme Perl faisant précisément cela, dans une liste de diffusion, mais je ne peux tout simplement pas le retrouver! J'ai copié l'exemple de fichier dot et l'ai étudié, car je ne connais pas beaucoup de cette syntaxe déclarative et je voulais en apprendre un peu plus.

Problème: avec le dernier Graphviz, Je avoir des erreurs (ou plutôt des avertissements, car le diagramme final est généré), à la fois dans le graphique original et celui que j'ai écrit (à la main). Certaines recherches ont montré que cette erreur a été trouvée dans les anciennes versions et a disparu dans les versions plus récentes. Regarde comme il est de retour.

Je donne toujours le fichier, peut-être que cela peut être un point de départ pour quelqu'un, ou peut-être que c'est suffisant pour 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 de exporter un certain nombre de formats. C'est plus de travail (calcul des positions/décalages) mais la structure est simple, ne devrait pas être trop difficile.

2
répondu PhiLho 2008-12-07 22:49:28