Saltar al contenido

Qué herramienta usar para dibujar un diagrama de árbol de archivos

Si encuentras algún error con tu código o proyecto, recuerda probar siempre en un entorno de testing antes aplicar el código al trabajo final.

Solución:

Copiar y pegar desde MS-DOS tree El comando también podría funcionar para usted. Ejemplos:

árbol

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

árbol / F

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

árbol / A

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

árbol / F / A

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

Sintaxis [source]

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

drive:path – Unidad y directorio que contiene el disco para mostrar la estructura del directorio, sin listar archivos.

/F – Incluya todos los archivos que viven en cada directorio.

/A – Reemplace los caracteres gráficos utilizados para vincular líneas con caracteres ext, en lugar de caracteres gráficos. /a se utiliza con páginas de códigos que no admiten caracteres gráficos y para enviar resultados a impresoras que no interpretan correctamente los caracteres gráficos.

Graphviz – de la página web:

Los programas de diseño Graphviz toman descripciones de gráficos en un lenguaje de texto simple y hacen diagramas en varios formatos útiles, como imágenes y SVG para páginas web, Postscript para su inclusión en PDF u otros documentos; o mostrarlo en un navegador de gráficos interactivo. (Graphviz también admite GXL, un dialecto XML).

Es la herramienta más simple y productiva que he encontrado para crear una variedad de diagramas de recuadros y líneas. Tengo y uso Visio y OmniGraffle, pero siempre existe la tentación de hacer “solo un ajuste más”.

También es bastante fácil escribir código para producir el formato de “archivo de puntos” que consume Graphiz, por lo que la producción automatizada de diagramas también está al alcance de la mano.

Como prometí, aquí está mi versión de El Cairo. Lo escribí con Lua, usando lfs para recorrer los directorios. Me encantan estos pequeños desafíos, ya que me permiten explorar las API que quería explorar durante bastante tiempo …
lfs y LuaCairo son multiplataforma, por lo que debería funcionar en otros sistemas (probado en francés WinXP Pro SP3).

Hice una primera versión dibujando nombres de archivos mientras caminaba por el árbol. Ventaja: sin sobrecarga de memoria. Inconveniente: tengo que especificar el tamaño de la imagen de antemano, por lo que es probable que los listados se corten.

Así que hice esta versión, primero recorriendo el árbol de directorios y guardándola en una tabla Lua. Luego, conociendo la cantidad de archivos, creando el lienzo para que quepa (al menos verticalmente) y dibujando los nombres.
Puede cambiar fácilmente entre la representación PNG y SVG. Problema con este último: Cairo lo genera a bajo nivel, dibujando las letras en lugar de usar la capacidad de texto de SVG. Bueno, al menos, garantiza una interpretación precisa incluso en sistemas sin la fuente. Pero los archivos son más grandes … No es realmente un problema si lo comprimes después para tener un archivo .svgz.
O no debería ser demasiado difícil generar el SVG directamente, usé Lua para generar SVG en el pasado.

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

Por supuesto, puede cambiar los estilos. No dibujé las líneas de conexión, no lo vi como necesario. Podría agregarlos opcionalmente más tarde.

Aquí tienes las comentarios y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *