เครื่องมืออะไรที่จะใช้ในการวาดแผนผังไฟล์ทรี [ปิด]


92

ให้แผนผังไฟล์ - ไดเร็กทอรีที่มีไดเร็กทอรีอยู่เป็นต้นคุณจะเขียนสคริปต์เพื่อสร้างไดอะแกรมของไฟล์ทรีเป็นไฟล์กราฟิกที่ฉันสามารถฝังในเอกสารโปรแกรมประมวลผลคำได้อย่างไร ฉันชอบไฟล์เวกเตอร์ (SVG, EPS, EMF ... ) มากกว่า เครื่องมือต้องทำงานบน Windows แต่ควรใช้ข้ามแพลตฟอร์ม เครื่องมือนี้อาจใช้ในเชิงพาณิชย์ แต่ควรให้บริการฟรี

ปรับปรุง 2012-02-20. คำถามเกี่ยวข้องกับโครงการย่อยด้านเอกสาร ฉันต้องอธิบายว่าไฟล์ (โดยเฉพาะทรัพยากรและไฟล์คอนฟิกูเรชัน) อยู่ที่ใด ฉันลงเอยด้วยการใช้คำสั่ง dos tree ฉันทั้งสองหน้าจอคว้าผลลัพธ์ (สำหรับโฟลเดอร์สั้น ๆ ) และสำหรับโฟลเดอร์ที่ยาวกว่าฉันเปลี่ยนเส้นทางไปยังไฟล์ข้อความซึ่งฉันแก้ไขแล้ว ตัวอย่างเช่นหากโฟลเดอร์ย่อยมีไฟล์ที่พิมพ์คล้ายกัน 20 ไฟล์ซึ่งทีละไฟล์ไม่มีความสำคัญต่อจุดที่ฉันสร้างฉันเหลือแค่สองไฟล์และแทนที่ส่วนที่เหลือด้วยหนึ่ง ... บรรทัด จากนั้นฉันก็พิมพ์ไฟล์ไปที่คอนโซลอีกครั้งและจับหน้าจอ ก่อนที่จะจับหน้าจอฉันต้องปรับเปลี่ยนสีพื้นหน้าเป็นสีดำและสีพื้นหลังเป็นสีขาวเพื่อให้ดูดีขึ้นและประหยัดหมึกในเอกสารที่ควรพิมพ์

เป็นเรื่องที่น่าแปลกใจมากที่ไม่มีเครื่องมือที่ดีกว่านี้ ถ้าฉันมีเวลาฉันจะเขียน Visio Extension หรืออาจเป็นบรรทัดคำสั่งที่สร้าง SVG SVG เป็น HTML5 ต่ำกว่ามาตรฐานอาจทำให้รวมไว้ในเอกสารออนไลน์ได้อย่างไม่เจ็บปวด

อัปเดต 2017-10-17. ขออภัยที่คำถามนี้ถูกลบออกเนื่องจากไม่ได้เป็นของ SO ดังนั้นฉันจึงพูดใหม่ ฉันต้องการสคริปต์ไม่ใช่เครื่องมือแบบ WYSIWYG ดังนั้นภาษาสคริปต์หรือไลบรารีใด ๆ ก็ใช้ได้ ดังนั้นมันจึงเป็นคำถามในการเขียนโค้ดและฉันเชื่อว่าเป็นของ SO


10
ทำไมคำถามนี้จึงถูกปิด? มีการเขียนโปรแกรม DSL เพื่อวาดต้นไม้เช่นเครื่องมือเช่น graphviz ซึ่งสามารถแก้ปัญหานี้ได้ "โดยทางโปรแกรม"
Piotr Lesnicki

5
ฉันจะเปิดสิ่งนี้อีกครั้ง (อย่างไม่เป็นทางการ) เพราะถ้าเป็น "ฉันจะแสดงสิ่งที่อยู่บนหน้าจอได้อย่างไร" เขาจะขอตัวจับหน้าจอ หากเขาต้องการวาดมันอาจเป็นเอกสารการออกแบบหรืองานนำเสนอดังนั้นเขาจะเขียนโปรแกรมในบางจุด
paxdiablo

2
เห็นด้วย ฉันเคยต้องการฟังก์ชั่นประเภทเดียวกันนี้มาก่อนและใช้วิธีแกล้ง Visio จำเป็นสำหรับเอกสารของสหภาพยุโรป แน่นอนว่าเกี่ยวข้องกับรหัส
Joseph Ferris

6
โง่มากที่ปิดเรื่องนี้เป็นนอกประเด็น ฉันก็พบความต้องการบางอย่างเช่นกัน .. ดังนั้นชอบที่จะเซ็นเซอร์
Boltimuss

1
ขออภัยหากคำถามของฉันไม่อยู่ในหัวข้อนี้ ฉันเข้าใจเหตุผลว่าทำไม ขอบคุณทุกคนที่ตอบมันเป็นประโยชน์ เพื่อความชัดเจนฉันต้องการไดอะแกรมเพื่อรวมไว้ในเอกสารของโครงสร้างโครงการ ภาพหน้าจอไม่ได้ตัดออกเนื่องจากต้นไม้ทั้งต้นยาวเกินพอดีกับหนึ่งหน้าจอ
Michael

คำตอบ:


98

การคัดลอกและวางจากtreeคำสั่งMS-DOS อาจใช้ได้ผลกับคุณเช่นกัน ตัวอย่าง:

ต้นไม้

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
...

ต้นไม้ / ก

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 แน่นอนว่าอาจไม่ใช่ปัญหาสำหรับผู้ใช้ส่วนใหญ่ (อย่างน้อยก็พูดภาษาอังกฤษ) เหมือนกันสำหรับตัวอักษรกึ่งกราฟิก
ฟีลโฮ

4
Linux ยังมีคำสั่ง "ต้นไม้" เช่นนี้ฉันเพิ่งค้นพบหลังจากตรวจสอบคำถาม Stack Overflow นี้ ขอบคุณที่ชี้ชื่อที่ฉันควรมองหา! "ต้นไม้ -A" คือการสร้างต้นไม้โดยใช้อักขระวาดสวย ๆ "ต้นไม้" ธรรมดาจะ จำกัด ตัวเองอยู่ใน ASCII
Brandon Rhodes

1
ดีฉันไม่รู้ด้วยซ้ำคำสั่งนี้
MiniScalope

มีตัวเลือกมากมายขอบคุณทุกคนที่นำเสนอ ฉันคิดว่านี่เป็นคำตอบเพราะนั่นคือสิ่งที่ฉันใช้ในตอนท้าย
Michael

1
หรือบันทึกลงในไฟล์โดยตรง: tree > file_structure.txtฉันรู้ว่าสิ่งนี้ใช้ได้กับระบบ Unix ฉันไม่รู้ว่ามันทำงานบน Windows ด้วยหรือเปล่า
Lucio Mollinedo

19

Graphviz - จากหน้าเว็บ:

โปรแกรมเค้าโครง Graphviz ใช้คำอธิบายกราฟในภาษาข้อความง่ายๆและสร้างไดอะแกรมในรูปแบบที่มีประโยชน์หลายอย่างเช่นรูปภาพและ SVG สำหรับหน้าเว็บ Postscript สำหรับรวมไว้ใน PDF หรือเอกสารอื่น ๆ หรือแสดงในเบราว์เซอร์กราฟเชิงโต้ตอบ (Graphviz ยังรองรับ GXL ซึ่งเป็นภาษาถิ่น XML)

เป็นเครื่องมือที่ง่ายและมีประสิทธิผลมากที่สุดที่ฉันพบในการสร้างไดอะแกรมแบบกล่องและเส้นต่างๆ ฉันมีและใช้ Visio และ OmniGraffle แต่มีสิ่งล่อใจเสมอที่จะ "ปรับเพิ่มอีกครั้งเดียว"

นอกจากนี้ยังค่อนข้างง่ายในการเขียนโค้ดเพื่อสร้างรูปแบบ "dot file" ที่ 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 ที่แพร่หลาย) เพื่อจับภาพส่วนหนึ่งของหน้าต่าง Explorer

ฉันทำสิ่งนี้เมื่อ 'สาธิต' แอปพลิเคชั่นอินเทอร์เน็ตซึ่งจะมีส่วนที่ยุบได้ฉันแค่สร้างไฟล์ที่ดูเหมือนรายการที่ฉันต้องการ

HyperSnap ให้ JPG เป็นอย่างน้อย (อาจเป็นอย่างอื่น แต่ฉันไม่เคยใส่ใจที่จะตรวจสอบ)

หรือคุณสามารถจับภาพหน้าจอไอคอน +/- จาก Explorer และใช้ภายใน MS Word Draw เพื่อทำภาพของคุณ แต่ฉันไม่เคยทำให้ MS Word Draw ทำงานได้อย่างถูกต้อง


2

คำแนะนำในการใช้ Graphviz เป็นสิ่งที่ดี: คุณสามารถสร้างไฟล์ dot และจะทำงานอย่างหนักในการวัดสตริงการจัดวางและอื่น ๆ นอกจากนี้ยังสามารถส่งออกกราฟในหลายรูปแบบรวมถึงเวกเตอร์

ฉันพบว่าโปรแกรม 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

ฉันจะลองทิศทางอื่นโดยใช้ไคโรซึ่งสามารถส่งออกได้หลายรูปแบบ มันเวิร์คกว่า (ตำแหน่งการคำนวณ / ออฟเซ็ต) แต่โครงสร้างเรียบง่ายไม่ควรยากเกินไป


1
Steve DeRose มี Perlscript ที่สร้างไฟล์โครงสร้าง -> ไฟล์ dot ที่derose.net/steve/utilities
claj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.