Dosya ağacı diyagramı çizmek için hangi araç kullanılmalı [kapalı]


92

Bir dosya ağacı verildiğinde - içinde dizinlerin olduğu bir dizin vb. Verildiğinde, bir kelime işlemci belgesine yerleştirebileceğim bir grafik dosyası olarak dosya ağacının bir diyagramını oluşturmak için nasıl bir komut dosyası yazarsınız? Vektör (SVG, EPS, EMF ...) dosyalarını tercih ederim. Araç Windows'ta çalışmalı, ancak tercihen çapraz platformda çalışmalıdır. Araç ticari olabilir ancak tercihen ücretsiz olabilir.

2012-02-20 Güncellemesi. Soru, bir dokümantasyon alt projesiyle ilgiliydi. Dosyaların (özellikle kaynaklar ve yapılandırma dosyalarının) nerede bulunduğunu açıklamam gerekiyordu. Dos tree komutunu kullanmaya başladım. Her iki ekran da sonucu yakaladım (kısa klasörler için) VE daha uzun klasörler için daha sonra düzenlediğim bir metin dosyasına yönlendirdim. Örneğin, bir alt klasör, yaptığım nokta için ayrı ayrı önemli olmayan benzer şekilde yazılmış 20 dosya içeriyorsa, sadece ikisini bıraktım ve geri kalanını bir ... satırıyla değiştirdim. Daha sonra dosyayı tekrar konsola yazdırdım ve ekrana baktım. Ekranı yakalamadan önce, daha iyi görünmek ve yazdırılması gereken bir belgede mürekkep tasarrufu yapmak için ön plan rengini siyah ve arka plan rengini beyaz olarak değiştirmem gerekiyordu.

Bunun için daha iyi bir aracın olmaması çok şaşırtıcı. Zamanım olsaydı, bir Visio Uzantısı yazardım veya SVG üreten bir komut satırı olabilirdim. SVG'nin HTML5 standartlarının altında olması, çevrimiçi belgelere sorunsuz bir şekilde dahil edilmesine bile izin verir.

2017-10-17'yi güncelleyin. Bu soru SO'ya ait olmadığı için kaldırıldığı için üzgünüm. Ben de yeniden yazdım. Bir komut dosyasına ihtiyacım var - bir WYSIWYG aracına değil. Yani herhangi bir komut dosyası dili veya kitaplığı uygundur. Yani bu bir kod yazma sorusu ve ben SO'ya ait olduğuna inanıyorum.


10
Bu soru neden kapandı? Ağaçlar çizmek için DSL'leri programlama vardır: örneğin bunu "programla" çözebilen graphviz gibi araçlar.
Piotr Lesnicki

5
Bunu yeniden açacağım (geçici olarak) çünkü basit bir "ekranda ne olduğunu nasıl gösteririm" olsaydı, bir ekran yakalayıcı isterdi. Çizmek istiyorsa, muhtemelen bir tasarım dokümanı veya sunum içindir, bu nedenle bir noktada programlama yapacaktır.
paxdiablo

2
Kabul. Bu tür bir işleve daha önce ihtiyacım vardı ve Visio ile bunu taklit etmeye başladım. AB belgeleri için gerekli. Kesinlikle kodla ilgiliydi.
Joseph Ferris

6
ÇOK Aptalca, bunu konu dışı olarak kapatmak. Ben de bir şeye ihtiyaç duydum .. Sansürlemeyi çok seviyor.
Boltimuss

1
Sorum burada konu dışı ise özür dilerim. Nedenini anlıyorum. Soranlara teşekkürler, yardımcı oldu. Açıklığa kavuşturmak için, proje ağacının dokümantasyonuna dahil edilecek bir diyagrama ihtiyacım vardı. Tüm ağaç bir ekrana sığdığından daha uzun olduğu için ekran görüntüsü kesmiyor.
Michael

Yanıtlar:


98

MS-DOS treekomutundan kopyalayıp yapıştırmak da işinize yarayabilir. Örnekler:

ağaç

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

ağaç / F

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

ağaç / A

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

ağaç / F / A

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

Sözdizimi [ kaynak ]

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

drive:\path - Dosyaları listelemeden dizin yapısının görüntülenmesi için disk içeren sürücü ve dizin.

/F - Her dizinde bulunan tüm dosyaları dahil edin.

/A- Satırları birbirine bağlamak için kullanılan grafik karakterlerini grafik karakterler yerine ext karakterleriyle değiştirin. /agrafik karakterleri desteklemeyen kod sayfalarında ve grafik karakterleri doğru şekilde yorumlamayan yazıcılara çıktı göndermek için kullanılır.


1
İyi fikir, ancak aksanlı harflere sahip dosyalar / klasörler varsa, bunlar Ansi'nin değil OEM karakter kümesinde olacaktır. Elbette çoğu (en azından İngilizce konuşan) kullanıcı için sorun değildir. Yarı grafik karakterler için aynı.
PhiLho

4
Linux'ta da bunun gibi bir "ağaç" komutu var, bu Stack Overflow sorusunu inceledikten sonra keşfettim. Aramam gereken adı gösterdiğin için teşekkürler! "ağaç-A", güzel çizim karakterleri kullanarak ağacın nasıl yaratılacağıdır; düz "ağaç" kendisini ASCII ile sınırlar.
Brandon Rodos

1
güzel, bu komutu bile bilmiyordum
MiniScalope

Bunları gündeme getirdiğiniz için çok sayıda seçenek var. Bunu bir cevap olarak görüyorum, çünkü sonunda bunu kullandım.
Michael

1
Veya doğrudan bir dosyaya kaydedin: tree > file_structure.txtBunun Unix sistemlerinde çalıştığını biliyorum. Windows'ta da çalışıp çalışmadığını bilmiyorum.
Lucio Mollinedo

19

Graphviz - web sayfasından:

Graphviz düzen programları, basit bir metin dilinde grafiklerin açıklamalarını alır ve web sayfaları için görüntüler ve SVG, PDF veya diğer belgelere dahil edilmek üzere Postscript gibi çeşitli yararlı formatlarda diyagramlar oluşturur; veya etkileşimli bir grafik tarayıcıda görüntüleyin. (Graphviz ayrıca bir XML lehçesi olan GXL'yi de destekler.)

Bu, çeşitli kutular ve çizgi diyagramları oluşturmak için bulduğum en basit ve en verimli araç. Visio ve OmniGraffle'im var ve kullanıyorum, ancak her zaman "yalnızca bir ayar daha" yapma isteği vardır.

Graphiz'in kullandığı "nokta dosya" biçimini üretmek için kod yazmak da oldukça kolaydır, bu nedenle otomatikleştirilmiş diyagram üretimi de kolayca erişilebilir.


5

Söz verdiğim gibi, işte Kahire versiyonum. Dizinlerde gezinmek için lfs'yi kullanarak Lua ile senaryo yazdım. Oldukça uzun süredir kazmak istediğim API'leri keşfetmeme izin verdiği için bu küçük zorlukları seviyorum ...
hem lfs hem de LuaCairo çapraz platformdur, bu nedenle diğer sistemlerde çalışmalıdır (Fransız WinXP Pro SP3'te test edilmiştir).

Ağaçta yürürken ilk sürüm dosya isimlerini çizdim. Avantaj: bellek ek yükü yok. Rahatsızlık: Görüntü boyutunu önceden belirlemem gerekiyor, bu nedenle listeler büyük olasılıkla kesilebilir.

Ben de bu versiyonu yaptım, önce dizin ağacında gezindim, onu bir Lua tablosunda sakladım. Ardından, dosya sayısını bilmek, tuvali sığdırmak için (en azından dikey olarak) oluşturmak ve isimleri çizmek.
PNG oluşturma ve SVG bir arasında kolayca geçiş yapabilirsiniz. İkincisiyle ilgili sorun: Cairo, SVG'nin metin yeteneğini kullanmak yerine harfleri çizerek onu düşük düzeyde üretir. En azından yazı tipi olmayan sistemlerde bile doğru işlemeyi garanti eder. Ama dosyalar daha büyük ... Daha sonra bir .svgz dosyasına sahip olmak için sıkıştırırsanız gerçekten sorun olmaz.
Veya doğrudan SVG oluşturmak çok zor olmamalı, geçmişte SVG oluşturmak için Lua'yı kullandım.

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

Elbette stilleri değiştirebilirsiniz. Bağlantı hatlarını ben çizmedim, gerekli görmedim. Daha sonra isteğe bağlı olarak ekleyebilirim.


3

Neden Windows dosya sisteminde bir dosya yapısı oluşturup bunu istediğiniz adlarla doldurup, ardından Explorer penceresinin bir bölümünü yakalamak için HyperSnap (veya her yerde bulunan Alt-PrtScr) gibi bir ekran yakalayıcıyı kullanamıyorsunuz?

Bunu, daraltılabilir bölümleri olan bir internet uygulamasını 'demo yaparken' yaptım, sadece istediğim girdilere benzeyen dosyalar oluşturmam gerekiyordu.

HyperSnap, en azından JPG'leri verir (muhtemelen diğerleri, ancak araştırmaya hiç zahmet etmedim).

Ya da, Explorer'dan +/- ikonları görüntüleyebilir ve bunları resminizi yapmak için MS Word Draw içinde kullanabilirsiniz, ancak MS Word Draw'un düzgün davranmasını asla sağlayamadım.


2

Graphviz'i kullanma tavsiyesi iyidir: nokta dosyasını oluşturabilirsiniz ve bu, dizeleri ölçmek, düzeni yapmak, vb. Gibi zor işleri yerine getirir. Ayrıca, grafikleri, vektör olanlar da dahil olmak üzere birçok formatta çıkarabilir.

Bir posta listesinde tam olarak bunu yapan bir Perl programı buldum, ancak onu geri bulamıyorum! Bu bildirime dayalı sözdizimi hakkında pek bir şey bilmediğim ve biraz daha fazlasını öğrenmek istediğim için örnek nokta dosyasını kopyaladım ve üzerinde çalıştım.

Sorun: en son Graphviz ile, hem orijinal grafikte hem de yazdığım grafikte (elle) hatalarım var (veya daha doğrusu, son diyagram oluşturulduğunda uyarılar). Bazı aramalar, bu hatanın eski sürümlerde bulunduğunu ve daha yeni sürümlerde kaybolduğunu gösterdi. Geri dönmüş gibi görünüyor.

Dosyayı hala veriyorum, belki birisi için bir başlangıç ​​noktası olabilir veya belki ihtiyaçlarınız için yeterli (tabii ki yine de oluşturmanız gerekiyor).

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

Bir dizi formatı da dışa aktarabilen Kahire'yi kullanarak başka bir yön deneyeceğim. Daha fazla iş (hesaplama pozisyonları / ofsetleri) ama yapı basit, çok zor olmamalı.


1
Steve DeRose'un dosya yapısı oluşturan bir Perlscript var -> nokta dosyası derose.net/steve/utilities
claj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.