Какой инструмент использовать для построения диаграммы дерева файлов [закрыто]

StackOverflow https://stackoverflow.com/questions/347551

Вопрос

Учитывая дерево файлов - каталог с каталогами в нем и т. д., как бы вы написали сценарий для создания диаграммы дерева файлов в виде графического файла, который я могу встроить в документ текстового процессора?Я предпочитаю векторные файлы (SVG, EPS, EMF...).Инструмент должен работать в Windows, но желательно кроссплатформенно.Инструмент может быть коммерческим, но желательно бесплатным.

Обновление 20 февраля 2012 г.Вопрос был связан с подпроектом документации.Мне пришлось объяснить, где находятся файлы (в частности, ресурсы и файлы конфигурации).В итоге я использовал команду дерева DOS.Я захватил результат на обоих экранах (для коротких папок), И для более длинных папок я перенаправил их в текстовый файл, который затем отредактировал.Например, если подпапка содержала 20 файлов одинакового типа, которые по отдельности не были важны для моей точки зрения, я оставлял только два и заменял остальные одним...линия.Затем я снова распечатал файл на консоли, и он захватил экран.Прежде чем сделать снимок экрана, мне пришлось изменить цвет переднего плана на черный, а цвет фона на белый, чтобы он выглядел лучше и сохранил чернила в документе, если он будет распечатан.

Очень удивительно, что лучшего инструмента для этого не существует.Если бы у меня было время, я бы написал расширение Visio или, может быть, какую-нибудь командную строку, которая создает SVG.Поскольку SVG не соответствует стандартам HTML5, его даже можно безболезненно включить в онлайн-документацию.

Обновление 17 октября 2017 г.Мне жаль, что этот вопрос был удален как не принадлежащий SO.Поэтому я перефразировал это.Мне нужен сценарий, а не WYSIWYG.Так что подойдет любой язык сценариев или библиотека.Итак, это вопрос написания кода, и я считаю, что он относится к SO.

Это было полезно?

Решение

Копирование и вставка из MS-DOS tree команда также может работать для вас.Примеры:

дерево

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

дерево /Ф

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

дерево /А

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

дерево /Ф /А

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

Синтаксис [источник]

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

drive:\path — Диск и каталог, содержащий диск, для отображения структуры каталогов без перечисления файлов.

/F — Включить все файлы, находящиеся в каждом каталоге.

/A — Замените графические символы, используемые для соединения строк, на дополнительные символы вместо графических символов. /a используется с кодовыми страницами, которые не поддерживают графические символы, и для отправки вывода на принтеры, которые неправильно интерпретируют графические символы.

Другие советы

Graphviz - с веб-страницы:

  

Программы макетов Graphviz берут описания графиков на простом текстовом языке и создают диаграммы в нескольких полезных форматах, таких как изображения и SVG для веб-страниц, Postscript для включения в PDF или другие документы; или отображать в браузере интерактивного графика. (Graphviz также поддерживает GXL, диалект XML.)

Это самый простой и продуктивный инструмент, который я нашел для создания различных диаграмм в виде прямоугольников и линий. У меня есть и использую Visio и OmniGraffle, но всегда есть соблазн сделать & Quot; просто еще одна настройка & Quot;.

Также довольно легко написать код для создания " dot file " формат, который использует Graphiz, так что автоматическое создание диаграмм также в пределах досягаемости.

Как и было обещано, вот моя Каирская версия. Я написал это с Lua, используя lfs для обхода каталогов. Мне нравятся эти маленькие проблемы, так как они позволяют мне исследовать API, которые я давно хотел копать ...
lfs и LuaCairo являются кроссплатформенными, поэтому он должен работать на других системах (протестировано на французском WinXP Pro SP3).

Я сделал первую версию, рисуя имена файлов, когда шел по дереву. Преимущество: нет накладных расходов памяти. Неудобство. Я должен указать размер изображения заранее, поэтому списки могут быть обрезаны.

Итак, я сделал эту версию, сначала пройдясь по дереву каталогов, сохранив его в таблице Lua. Затем, зная количество файлов, создайте холст по размеру (хотя бы по вертикали) и нарисуйте имена.
Вы можете легко переключаться между рендерингом PNG и SVG. Проблема с последним: Каир генерирует его на низком уровне, рисуя буквы вместо использования текстовых возможностей SVG. Ну, по крайней мере, это гарантирует точную визуализацию даже в системах без шрифта. Но файлы больше ... На самом деле не проблема, если вы сжимаете их после, чтобы получить файл .svgz.
Или не должно быть слишком сложно генерировать SVG напрямую, я использовал Lua для генерации SVG в прошлом.

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

Конечно, вы можете изменить стили. Я не рисовал соединительные линии, я не видел в этом необходимости. Я могу добавить их по желанию позже.

Почему вы не можете просто создать файловую структуру в файловой системе Windows и заполнить ее нужными именами, а затем использовать средство захвата экрана, такое как HyperSnap (или вездесущий Alt-PrtScr), чтобы захватить часть окна проводника.

Я сделал это, когда «демонстрировал» интернет-приложение, в котором были бы складные разделы, мне просто нужно было создать файлы, которые выглядели как мои нужные записи.

HyperSnap дает JPG по крайней мере (возможно, другие, но я никогда не удосужился исследовать).

Или вы можете сделать снимок экрана с иконками +/- из Проводника и использовать их в самой программе MS Word Draw, чтобы сделать свою фотографию, но мне никогда не удавалось заставить MS Word Draw вести себя правильно.

Совет по использованию Graphviz хорош: вы можете сгенерировать файл точек, и он будет выполнять тяжелую работу по измерению строк, макету и т. д. Кроме того, он может выводить графики в большом количестве форматов, включая векторные.

Я обнаружил, что программа Perl делает именно это в списке рассылки, но я просто не могу найти его обратно! Я скопировал образец файла точек и изучил его, так как я не очень разбираюсь в этом декларативном синтаксисе и хотел узнать немного больше.

Проблема: в последней версии Graphviz у меня есть ошибки (или, скорее, предупреждения, поскольку генерируется окончательная диаграмма), как в исходном графике, так и в том, который я написал (вручную). Некоторые поиски показали, что эта ошибка была обнаружена в старых версиях и исчезла в более поздних версиях. Похоже, он вернулся.

Я все еще даю файл, может быть, он может послужить отправной точкой для кого-то, или, может быть, этого достаточно для ваших нужд (конечно, вы все равно должны его сгенерировать).

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

Я попробую другое направление, используя Cairo, который также может экспортировать несколько форматов. Это больше работы (вычисление позиций / смещений), но структура простая, не должна быть слишком сложной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top