Який інструмент використовувати для малювання діаграми дерева файлів [закрито]


90

Враховуючи дерево файлів - каталог із каталогами в ньому тощо, як би ви написали сценарій для створення діаграми файлового дерева як графічного файлу, який я можу вставити в документ текстового процесора. Я віддаю перевагу векторним (SVG, EPS, EMF ...) файлам. Інструмент повинен працювати в ОС Windows, але бажано на різних платформах. Інструмент може бути комерційним, але бажано безкоштовним.

Оновлення 2012-02-20. Питання стосувалось підпроекту документації. Мені довелося пояснити, де знаходяться файли (зокрема файли ресурсів та конфігурації). Я закінчив із використанням команди дерева дерева. Я обидва екрани схопив результат (для коротких папок), А для довших папок перенаправив у текстовий файл, який потім відредагував. Наприклад, якщо підпапка містила 20 файлів подібного типу, які окремо не були важливі для моєї справи, я залишив лише два, а решту замінив одним ... рядком. Потім я роздрукував файл на консолі ще раз і екран захопив його. Перед захопленням екрану мені довелося змінити колір переднього плану на чорний, а колір фону - на білий, щоб виглядати краще та зберігати чорнило в документі, який слід надрукувати.

Дуже дивно, що кращого інструменту для цього немає. Якби у мене був час, я б написав розширення Visio або, можливо, якийсь командний рядок, який створює SVG. SVG, який є нестандартним HTML5, навіть дозволить безболісно включати його в онлайн-документацію.

Оновлення 2017-10-17. Мені шкода, що це питання було видалено як таке, що не належить SO. Тож я переформулював це. Мені потрібен сценарій - не інструмент WYSIWYG. Тож будь-яка мова сценаріїв або бібліотека - це нормально. Отже, це питання написання коду, і я вважаю, що належить SO.


10
Чому це питання закрите? Існують програмувальні DSL для малювання дерев: наприклад, такі інструменти, як graphviz, які можуть вирішити це "програмно".
Piotr Lesnicki

5
Я збираюся знову відкрити це (орієнтовно), оскільки якби це було просте "як мені показати, що на екрані", він би попросив захоплювач екрану. Якщо він хоче намалювати його, це, мабуть, для дизайнерського документа або презентації, отже, він колись програмує.
paxdiablo

2
Домовились. Мені раніше потрібен був такий самий тип функціоналу, і я вдався до його фальшивки за допомогою Visio. Це потрібно для документації ЄС. Безумовно, це було пов'язано з кодом.
Джозеф Ферріс

6
ДУЖЕ дурний, щоб закрити це як не-тему. Я теж знайшов потребу в чомусь. ТАК люблю цензурувати.
Boltimuss

1
Мені шкода, якщо моє запитання тут не відповідає темі. Я розумію причину, чому. Дякую всім, хто піднявся, це було корисно. Щоб пояснити, мені потрібна була схема, яку слід включити в документацію дерева проекту. Знімок екрана не вирізає його, оскільки все дерево довше, ніж вміщує один екран.
Майкл

Відповіді:


95

Копіювання та вставка з команди 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
...

дерево / 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- Замініть графічні символи, що використовуються для зв’язування рядків, на зовнішні символи, замість графічних символів. /aвикористовується з кодовими сторінками, які не підтримують графічні символи, і для надсилання вихідних даних на принтери, які неправильно інтерпретують графічні символи.


1
Хороша ідея, але якщо є файли / папки з наголошеними літерами, вони будуть в OEM-коді, а не в Ansi. Можливо, це не проблема для більшості (принаймні англійської мови) користувачів, звичайно. Те саме для напівграфічних символів.
PhiLho

4
Linux також має таку команду "дерево", яку я щойно виявив, перевіривши це запитання щодо переповнення стека. Дякую, що вказали ім’я, яке мені слід шукати! "дерево -A" - це спосіб створення дерева за допомогою симпатичних символів малювання; звичайне "дерево" просто обмежується ASCII.
Брендон Роудс

1
приємно, я навіть не знав цієї команди
MiniScalope

Існує багато варіантів, дякую усім, що їх підняли. Я вважаю це однією відповіддю, бо саме цим я врешті-решт скористався.
Майкл

1
Або збережіть його прямо у файл: tree > file_structure.txtя знаю, що це працює в системах Unix. Не знаю, чи працює це і в Windows.
Lucio Mollinedo

19

Graphviz - з веб-сторінки:

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

Це найпростіший і найпродуктивніший інструмент, який я знайшов для створення різноманітних діаграм прямокутників. Я маю і використовую Visio та OmniGraffle, але завжди є спокуса зробити "ще одне коригування".

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


5

Як і було обіцяно, ось моя каїрська версія. Я написав його за допомогою 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")

Звичайно, ви можете змінити стилі. Я не малював лінії зв’язку, не бачив цього як потрібно. Я можу додати їх за бажанням пізніше.


3

Чому б ви не могли просто створити структуру файлів у файловій системі Windows і заповнити її потрібними іменами, а потім скористатися захоплювачем екрана, таким як HyperSnap (або всюдисущий Alt-PrtScr), щоб зафіксувати розділ вікна Провідника.

Я зробив це, коли “демонстрував” Інтернет-додаток, який міг би складати розділи, мені просто потрібно було створити файли, які виглядали як мої бажані записи.

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

Або ви можете зафіксувати на екрані піктограми +/- з Провідника і використовувати їх у самому програмі MS Word Draw для створення вашого зображення, але я ніколи не міг змусити MS Word Draw поводитися належним чином.


2

Порада використовувати 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

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


1
У Стіва Дероуза є Perlscript, що робить структуру файлів -> крапковий файл на derose.net/steve/utilities
claj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.