Alat apa yang digunakan untuk menggambar diagram pohon file [tertutup]

90

Diberikan pohon file - direktori dengan direktori di dalamnya dll, bagaimana Anda akan menulis skrip untuk membuat diagram pohon file sebagai file grafik yang dapat saya sematkan dalam dokumen pengolah kata. Saya lebih suka file vektor (SVG, EPS, EMF ...). Alat tersebut harus berjalan di Windows, tetapi sebaiknya lintas platform. Alat tersebut mungkin komersial tetapi sebaiknya gratis.

Perbarui 2012-02-20. Pertanyaan itu terkait dengan sub proyek dokumentasi. Saya harus menjelaskan di mana file (dalam sumber daya dan file konfigurasi tertentu) berada. Saya akhirnya menggunakan perintah pohon dos. Saya kedua layar mengambil hasilnya (untuk folder pendek) DAN untuk folder yang lebih panjang saya diarahkan ke file teks, yang kemudian saya edit. Misalnya jika subfolder berisi 20 file dengan tipe yang sama yang secara individual tidak penting sampai pada poin yang saya buat, saya hanya menyisakan dua dan mengganti sisanya dengan satu ... baris. Saya kemudian mencetak file ke konsol lagi dan layar mengambilnya. Sebelum screen grabbing saya harus memodifikasi warna foreground menjadi hitam dan warna background menjadi putih, agar terlihat lebih baik dan menghemat tinta pada dokumen yang harus di print.

Sangat mengejutkan bahwa tidak ada alat yang lebih baik untuk itu. Jika saya punya waktu, saya akan menulis Ekstensi Visio atau mungkin beberapa baris perintah yang menghasilkan SVG. SVG menjadi HTML5 di bawah standar, bahkan memungkinkan penyertaan tanpa rasa sakit ke dalam dokumentasi online.

Perbarui 2017-10-17. Saya minta maaf karena pertanyaan ini dihapus karena bukan milik SO. Jadi saya telah mengulanginya. Saya membutuhkan skrip - bukan alat WYSIWYG. Jadi bahasa atau pustaka skrip apa pun tidak apa-apa. Jadi ini adalah pertanyaan penulisan kode, dan saya yakin milik SO.

Michael
sumber
10
Mengapa pertanyaan ini ditutup? Ada pemrograman DSL untuk menggambar pohon: misalnya alat seperti graphviz yang dapat menyelesaikan ini "secara terprogram".
Piotr Lesnicki
5
Saya akan membuka kembali ini (sementara) karena jika itu sederhana "bagaimana cara menampilkan apa yang ada di layar", dia akan meminta penangkap layar. Jika dia ingin menggambarnya, mungkin itu untuk dokumen desain atau presentasi, maka dia akan memprogram di beberapa titik.
paxdiablo
2
Sepakat. Saya membutuhkan jenis fungsionalitas yang sama ini sebelumnya dan terpaksa memalsukannya dengan Visio. Membutuhkannya untuk dokumentasi UE. Pasti terkait kode.
Joseph Ferris
6
SANGAT Bodoh, untuk menutup ini karena di luar topik. Saya juga telah menemukan kebutuhan akan sesuatu .. SANGAT suka menyensor.
Boltimuss
1
Saya minta maaf jika pertanyaan saya di luar topik di sini. Saya mengerti alasannya mengapa. Terima kasih untuk semua yang telah menjawab, ini sangat membantu. Untuk memperjelas, saya membutuhkan diagram untuk dimasukkan ke dalam dokumentasi pohon proyek. Tangkapan layar tidak memotongnya karena seluruh pohon lebih panjang dari satu layar.
Michael

Jawaban:

95

Menyalin dan menempel dari perintah MS-DOS treemungkin juga berfungsi untuk Anda. Contoh:

pohon

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

pohon / F.

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

pohon / A

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

pohon / F / A

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

Sintaks [ sumber ]

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

drive:\path - Drive dan direktori yang berisi disk untuk tampilan struktur direktori, tanpa mencantumkan file.

/F - Sertakan semua file yang tinggal di setiap direktori.

/A- Ganti karakter grafik yang digunakan untuk menghubungkan baris dengan karakter ext, bukan karakter grafik. /adigunakan dengan halaman kode yang tidak mendukung karakter grafik dan untuk mengirimkan output ke printer yang tidak menginterpretasikan karakter grafik dengan benar.

svinto
sumber
1
Ide bagus, tetapi jika ada file / folder dengan huruf beraksen, akan ada di rangkaian karakter OEM, bukan Ansi. Mungkin bukan masalah bagi sebagian besar pengguna (setidaknya berbahasa Inggris), tentu saja. Sama untuk karakter semi-grafis.
PhiLho
4
Linux juga memiliki perintah "pohon" seperti ini, saya baru saja menemukannya setelah memeriksa pertanyaan Stack Overflow ini. Terima kasih telah menunjukkan nama yang harus saya cari! "pohon -A" adalah cara membuat pohon menggunakan karakter gambar cantik; "pohon" biasa hanya membatasi dirinya pada ASCII.
Brandon Rhodes
1
bagus, saya bahkan tidak tahu perintah ini
MiniScalope
Ada banyak pilihan, terima kasih untuk semua yang telah memunculkannya. Saya menganggap ini sebagai jawaban, karena itulah yang saya gunakan pada akhirnya.
Michael
1
Atau simpan langsung ke file: tree > file_structure.txtSaya tahu ini berfungsi pada sistem Unix. Saya tidak tahu apakah itu berfungsi di Windows juga.
Lucio Mollinedo
19

Graphviz - dari halaman web:

Program tata letak Graphviz mengambil deskripsi grafik dalam bahasa teks sederhana, dan membuat diagram dalam beberapa format yang berguna seperti gambar dan SVG untuk halaman web, Postscript untuk dimasukkan dalam PDF atau dokumen lain; atau tampilkan di browser grafik interaktif. (Graphviz juga mendukung GXL, dialek XML.)

Ini adalah alat paling sederhana dan paling produktif yang saya temukan untuk membuat berbagai diagram kotak-dan-garis. Saya memiliki dan menggunakan Visio dan OmniGraffle, tetapi selalu ada godaan untuk membuat "satu penyesuaian lagi".

Ini juga cukup mudah untuk menulis kode untuk menghasilkan format "file titik" yang digunakan Graphiz, jadi produksi diagram otomatis juga mudah dijangkau.

joel.neely
sumber
5

Seperti yang dijanjikan, ini versi Kairo saya. Saya membuat skrip dengan Lua, menggunakan lfs untuk menjalankan direktori. Saya suka tantangan kecil ini, karena memungkinkan saya menjelajahi API yang ingin saya gali selama beberapa waktu ...
lfs dan LuaCairo keduanya lintas platform, jadi harus berfungsi pada sistem lain (diuji pada WinXP Pro SP3 Prancis).

Saya membuat nama file gambar versi pertama saat saya berjalan di pohon. Keuntungan: tidak ada overhead memori. Ketidaknyamanan: Saya harus menentukan ukuran gambar sebelumnya, jadi daftar kemungkinan akan terpotong.

Jadi saya membuat versi ini, pertama berjalan di pohon direktori, menyimpannya dalam tabel Lua. Kemudian, mengetahui jumlah file, membuat kanvas agar pas (setidaknya secara vertikal) dan menggambar nama.
Anda dapat dengan mudah beralih antara rendering PNG dan SVG. Masalah dengan yang terakhir: Kairo menghasilkannya pada tingkat rendah, menggambar huruf-hurufnya alih-alih menggunakan kemampuan teks SVG. Yah, setidaknya, ini menjamin rending yang akurat bahkan pada sistem tanpa font. Tapi filenya lebih besar ... Tidak masalah jika Anda mengompresnya setelahnya, untuk memiliki file .svgz.
Atau seharusnya tidak terlalu sulit untuk menghasilkan SVG secara langsung, saya menggunakan Lua untuk menghasilkan SVG di masa lalu.

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

Tentu saja, Anda dapat mengubah gayanya. Saya tidak menggambar garis koneksi, saya tidak melihatnya seperlunya. Saya mungkin menambahkannya nanti secara opsional.

PhiLho
sumber
3

Mengapa Anda tidak bisa hanya membuat struktur file pada sistem file Windows dan mengisinya dengan nama yang Anda inginkan, lalu gunakan screen grabber seperti HyperSnap (atau Alt-PrtScr yang ada di mana-mana) untuk menangkap bagian dari jendela Explorer.

Saya melakukan ini ketika 'mendemonstrasikan' aplikasi internet yang memiliki bagian yang bisa dilipat, saya hanya perlu membuat file yang tampak seperti entri yang saya inginkan.

HyperSnap setidaknya memberikan JPG (mungkin yang lain tetapi saya tidak pernah repot-repot untuk menyelidikinya).

Atau Anda dapat menangkap layar ikon +/- dari Explorer dan menggunakannya di dalam MS Word Draw itu sendiri untuk mengerjakan gambar Anda, tetapi saya tidak pernah bisa membuat MS Word Draw berperilaku dengan benar.

paxdiablo
sumber
2

Saran untuk menggunakan Graphviz bagus: Anda dapat membuat file titik dan itu akan melakukan kerja keras untuk mengukur string, melakukan tata letak, dll. Selain itu, Graphviz dapat menampilkan grafik dalam banyak format, termasuk yang vektor.

Saya menemukan program Perl melakukan hal itu dengan tepat, di milis, tetapi saya tidak dapat menemukannya kembali! Saya menyalin file contoh titik dan mempelajarinya, karena saya tidak tahu banyak tentang sintaks deklaratif dan saya ingin mempelajari lebih banyak.

Masalah: dengan Graphviz terbaru, saya memiliki kesalahan (atau lebih tepatnya, peringatan, saat diagram terakhir dibuat), baik dalam grafik asli maupun yang saya tulis (dengan tangan). Beberapa pencarian menunjukkan kesalahan ini ditemukan di versi lama dan menghilang di versi yang lebih baru. Sepertinya sudah kembali.

Saya tetap memberikan filenya, mungkin bisa menjadi titik awal bagi seseorang, atau mungkin sudah cukup untuk kebutuhan Anda (tentunya Anda tetap harus membuatnya).

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

Saya akan mencoba arah lain, menggunakan Kairo, yang juga dapat mengekspor sejumlah format. Ini lebih banyak pekerjaan (menghitung posisi / offset) tetapi strukturnya sederhana, tidak boleh terlalu keras.

PhiLho
sumber
1
Steve DeRose memiliki Perlscript membuat struktur file -> file dot di derose.net/steve/utilities
claj