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



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



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



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



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

647   5  

5 ответов:

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

дерево

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

дерево / F

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

дерево / A

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

tree /F / A

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 - замените графические символы, используемые для связывания строк с символами ext , вместо графических символов. /a используется с кодовыми страницами, которые не поддерживают графические символы и для отправки вывода на принтеры, которые не правильно интерпретируют графику письмена.

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

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

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

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

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

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

поэтому я сделал эту версию, сначала пройдя дерево каталогов, сохранив его в таблице Lua. Затем, зная количество файлов, Создаем холст по размеру (хотя бы по вертикали) и прорисовываем имена.
Вы можете легко переключаться между рендерингом PNG и SVG one. Проблема с последним: Cairo генерирует его на низком уровне, рисуя буквы вместо использования текстовой возможности 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 дает JPGs по крайней мере (возможно, другие, но я никогда не беспокоился исследовать.)

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

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

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

проблема: с последний 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

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

Comments

    Ничего не найдено.