Quale strumento utilizzare per disegnare il diagramma ad albero dei file [chiuso]


90

Dato un albero dei file - una directory con le directory al suo interno, ecc., Come scrivereste uno script per creare un diagramma dell'albero dei file come un file grafico che posso incorporare in un documento di un elaboratore di testi. Preferisco i file vettoriali (SVG, EPS, EMF ...). Lo strumento deve essere eseguito su Windows, ma preferibilmente multipiattaforma. Lo strumento può essere commerciale ma preferibilmente gratuito.

Aggiornamento 2012-02-20. La domanda era relativa a un sottoprogetto di documentazione. Ho dovuto spiegare dove risiedono i file (in particolare risorse e file di configurazione). Ho finito con l'utilizzo del comando dos tree. Entrambi ho catturato il risultato (per cartelle brevi) E per cartelle più lunghe ho reindirizzato a un file di testo, che ho poi modificato. Ad esempio, se una sottocartella conteneva 20 file di tipo simile che singolarmente non erano importanti per il punto che stavo facendo, ne ho lasciati solo due e ho sostituito il resto con una ... riga. Quindi ho stampato di nuovo il file sulla console e lo schermo lo ha catturato. Prima di catturare lo schermo ho dovuto modificare il colore di primo piano in nero e il colore di sfondo in bianco, per avere un aspetto migliore e risparmiare inchiostro in un documento che doveva essere stampato.

È molto sorprendente che non ci sia strumento migliore per questo. Se avessi tempo, scriverei un'estensione di Visio o potrebbe essere una riga di comando che produce SVG. Essendo SVG inferiore agli standard HTML5, consentirebbe persino l'inclusione indolore nella documentazione online.

Aggiornamento 2017-10-17. Mi dispiace che questa domanda sia stata rimossa in quanto non appartenente a SO. Quindi l'ho riformulato. Ho bisogno di uno script, non di uno strumento WYSIWYG. Quindi qualsiasi linguaggio di script o libreria va bene. Quindi è una domanda da scrivere in codice e credo che appartenga a SO.


10
Perché questa domanda è chiusa? Ci sono DSL di programmazione per disegnare alberi: ad esempio strumenti come graphviz che possono risolvere questo problema "programmaticamente".
Piotr Lesnicki

5
Lo riaprirò (provvisoriamente) perché se fosse stato un semplice "come faccio a mostrare cosa c'è sullo schermo", avrebbe chiesto uno screen grabber. Se vuole disegnarlo, probabilmente è per un documento di progettazione o una presentazione, quindi ad un certo punto programmerà.
paxdiablo

2
Concordato. Ho già avuto bisogno di questo stesso tipo di funzionalità e ho fatto ricorso a falsificarlo con Visio. Necessario per la documentazione UE. Sicuramente era legato al codice.
Joseph Ferris

6
MOLTO stupido, chiudere questo come fuori tema. Anch'io ho trovato bisogno di qualcosa .. COSÌ adora censurare.
Boltimuss

1
Mi dispiace se la mia domanda è fuori tema qui. Capisco il motivo. Grazie a tutti coloro che hanno risposto, è stato utile. Per chiarire, avevo bisogno di un diagramma da includere nella documentazione dell'albero del progetto. Lo screenshot non lo taglia perché l'intero albero è più lungo di quanto si adatti a uno schermo.
Michael

Risposte:


95

Anche copiare e incollare dal treecomando MS-DOS potrebbe funzionare. Esempi:

albero

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

albero / F

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

albero / A

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

albero / F / A

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

Sintassi [ fonte ]

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

drive:\path - Drive e directory contenente il disco per la visualizzazione della struttura delle directory, senza elencare i file.

/F - Include tutti i file che vivono in ogni directory.

/A- Sostituisci i caratteri grafici usati per collegare le linee con caratteri ext, invece che con caratteri grafici. /aviene utilizzato con le tabelle codici che non supportano i caratteri grafici e per inviare l'output a stampanti che non interpretano correttamente i caratteri grafici.


1
Buona idea, ma se ci sono file / cartelle con lettere accentate, saranno nel set di caratteri OEM, non in quello Ansi. Probabilmente un non-problema per la maggior parte degli utenti (almeno di lingua inglese), ovviamente. Lo stesso per i caratteri semi-grafici.
PhiLho

4
Linux ha anche un comando "albero" come questo, l'ho appena scoperto dopo aver controllato questa domanda su Stack Overflow. Grazie per aver indicato il nome che dovrei cercare! "tree -A" è come creare l'albero usando graziosi caratteri di disegno; il semplice "albero" si limita ad ASCII.
Brandon Rhodes

1
bello, non conoscevo nemmeno questo comando
MiniScalope

Esistono molte opzioni, grazie a tutti per averle sollevate. Considero questa una risposta, perché è quello che ho usato alla fine.
Michael

1
Oppure salvalo direttamente in un file: tree > file_structure.txtso che funziona su sistemi Unix. Non so se funziona anche su Windows.
Lucio Mollinedo

19

Graphviz - dalla pagina web:

I programmi di layout Graphviz accettano descrizioni di grafici in un semplice linguaggio di testo e creano diagrammi in diversi formati utili come immagini e SVG per pagine web, Postscript per l'inclusione in PDF o altri documenti; o visualizzare in un browser grafico interattivo. (Graphviz supporta anche GXL, un dialetto XML.)

È lo strumento più semplice e produttivo che ho trovato per creare una varietà di diagrammi a riquadri e linee. Possiedo e utilizzo Visio e OmniGraffle, ma c'è sempre la tentazione di fare "solo un'altra regolazione".

È anche abbastanza facile scrivere codice per produrre il formato "file punto" utilizzato da Graphiz, quindi anche la produzione automatizzata di diagrammi è a portata di mano.


5

Come promesso, ecco la mia versione del Cairo. L'ho scritto con Lua, usando lfs per scorrere le directory. Adoro queste piccole sfide, poiché mi consentono di esplorare le API che volevo scavare per un po 'di tempo ...
lfs e LuaCairo sono entrambi multipiattaforma, quindi dovrebbe funzionare su altri sistemi (testato su WinXP Pro SP3 francese).

Ho creato una prima versione disegnando i nomi dei file mentre camminavo sull'albero. Vantaggio: nessun sovraccarico di memoria. Inconveniente: devo specificare in anticipo la dimensione dell'immagine, quindi è probabile che le inserzioni vengano tagliate.

Quindi ho creato questa versione, prima camminando nell'albero delle directory, memorizzandola in una tabella Lua. Quindi, conoscendo il numero di file, creando la tela per adattarla (almeno verticalmente) e disegnando i nomi.
Puoi passare facilmente dal rendering PNG a quello SVG. Problema con quest'ultimo: Cairo lo genera a basso livello, disegnando le lettere invece di usare la capacità di testo di SVG. Beh, almeno, garantisce un rending accurato anche su sistemi senza il font. Ma i file sono più grandi ... Non è un problema se lo comprimi dopo, per avere un file .svgz.
Oppure non dovrebbe essere troppo difficile generare l'SVG direttamente, ho usato Lua per generare SVG in passato.

-- 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")

Ovviamente puoi cambiare gli stili. Non ho tracciato le linee di collegamento, non l'ho visto come necessario. Potrei aggiungerli facoltativamente in seguito.


3

Perché non potresti semplicemente creare una struttura di file sul file system di Windows e popolarla con i nomi desiderati, quindi utilizzare uno screen grabber come HyperSnap (o l'onnipresente Alt-PrtScr) per catturare una sezione della finestra di Explorer.

L'ho fatto durante la "demo" di un'applicazione Internet che avrebbe sezioni comprimibili, dovevo solo creare file che assomigliassero alle voci desiderate.

HyperSnap fornisce almeno JPG (probabilmente altri ma non mi sono mai preso la briga di indagare).

Oppure potresti catturare lo schermo delle icone +/- da Explorer e usarle all'interno di MS Word Draw stesso per fare la tua immagine, ma non sono mai stato in grado di far sì che MS Word Draw si comportasse correttamente.


2

Il consiglio per usare Graphviz è buono: puoi generare il file punto e farà il duro lavoro di misurare le stringhe, fare il layout, ecc. Inoltre può produrre i grafici in molti formati, inclusi quelli vettoriali.

Ho trovato un programma Perl che fa esattamente questo, in una mailing list, ma non riesco proprio a trovarlo! Ho copiato il file dot di esempio e l'ho studiato, poiché non conosco molto di questa sintassi dichiarativa e volevo imparare un po 'di più.

Problema: con l'ultimo Graphviz, ho degli errori (o meglio, degli avvisi, poiché viene generato il diagramma finale), sia nel grafico originale che in quello che ho scritto (a mano). Alcune ricerche hanno mostrato che questo errore è stato trovato nelle versioni precedenti ed è scomparso nelle versioni più recenti. Sembra che sia tornato.

Ti do ancora il file, forse può essere un punto di partenza per qualcuno, o forse è sufficiente per le tue esigenze (ovviamente, devi ancora generarlo).

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

Proverò in un'altra direzione, usando Cairo, che è anche in grado di esportare una serie di formati. È più lavoro (calcolare posizioni / offset) ma la struttura è semplice, non dovrebbe essere troppo difficile.


1
Steve DeRose ha una struttura dei file per la creazione di
Perlscript
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.