ファイルツリー図を描画するために使用するツール[クローズ]


90

ファイルツリー(ディレクトリが含まれるディレクトリなど)が与えられた場合、ワードプロセッサドキュメントに埋め込むことができるグラフィックファイルとしてファイルツリーの図を作成するスクリプトをどのように記述しますか。私はベクター(SVG、EPS、EMF ...)ファイルを好みます。ツールはWindowsで実行する必要がありますが、クロスプラットフォームが望ましいです。ツールは市販されていてもよいが、好ましくは無料である。

2012-02-20を更新します。質問は、ドキュメントサブプロジェクトに関連していました。ファイル(特にリソースと構成ファイル)がどこにあるかを説明する必要がありました。結局、DOSツリーコマンドを使用することになりました。結果を画面で取得し(短いフォルダーの場合)、長いフォルダーの場合はテキストファイルにリダイレクトし、それを編集しました。たとえば、サブフォルダーに20個の同様に入力されたファイルが含まれていて、個別に作成する時点では重要ではなかった場合、2つだけ残し、残りを1つの...行に置き換えました。次に、ファイルをコンソールに再度印刷し、画面で取得しました。画面をつかむ前に、前景色を黒に、背景色を白に変更して、見栄えを良くし、印刷する必要があるドキュメントのインクを節約する必要がありました。

それのためのより良いツールがないことは非常に驚くべきことです。時間があれば、Visio Extensionを作成するか、SVGを生成するコマンドラインである可能性があります。SVGはHTML5の標準以下であるため、オンラインドキュメントに簡単に含めることもできます。

2017-10-17を更新します。この質問はSOに属していないため、削除されて申し訳ありません。だから私はそれを言い換えました。WYSIWYGツールではなくスクリプトが必要です。したがって、どのスクリプト言語やライブラリでも問題ありません。つまり、これはコードを書く質問であり、私はSOに属していると信じています。


10
なぜこの質問は閉じられるのですか?ツリーを描画するためのプログラミングDSLがあります。たとえば、これを「プログラムで」解決できるgraphvizのようなツールです。
Piotr Lesnicki 2008

5
これを(暫定的に)再開します。単純な「画面に表示されているものを表示するにはどうすればよいか」の場合、彼はスクリーングラバーを要求したはずだからです。彼がそれを描きたいのなら、それはおそらくデザインドキュメントやプレゼンテーションのためのものなので、彼はある時点でプログラミングをするでしょう。
paxdiablo 2008

2
同意しました。私は以前にこれと同じタイプの機能が必要であり、Visioでそれを偽造することに頼っていました。EUの文書化のためにそれが必要でした。間違いなくコード関連でした。
ジョセフフェリス

6
非常に愚かです、これをオフトピックとして閉じます。私も何かの必要性を見つけました..SOは検閲が大好きです。
Boltimuss 2014

1
私の質問がここで話題から外れている場合は申し訳ありません。私はその理由を理解しています。答えてくれたすべての人のおかげで、それは役に立ちました。明確にするために、プロジェクトツリーのドキュメントに含める図が必要でした。ツリー全体が1つの画面に収まるよりも長いため、スクリーンショットはそれをカットしません。
マイケル

回答:


95

MS-DOStreeコマンドからのコピーと貼り付けも機能する場合があります。例:

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

ツリー/ 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グラフィック文字をサポートしないコードページで使用され、グラフィック文字を適切に解釈しないプリンタに出力を送信します。


1
良い考えですが、アクセント付きの文字が付いたファイル/フォルダがある場合、それらはAnsiではなくOEM文字セットになります。もちろん、ほとんどの(少なくとも英語を話す)ユーザーにとってはおそらく問題ではありません。セミグラフィック文字についても同じです。
PhiLho 2008

4
Linuxにもこのような「tree」コマンドがあります。このStackOverflowの質問を確認したところ、私はちょうど発見しました。私が探すべき名前を指摘してくれてありがとう!「tree-A」は、きれいな描画文字を使用してツリーを作成する方法です。プレーンな「ツリー」は、ASCIIに限定されます。
Brandon Rhodes

1
いいですね、私もこのコマンドを知りませんでした
MiniScalope 2010

それらを育ててくれたすべての人のおかげで、多くのオプションが存在します。それが私が最終的に使用したものであるため、私はこれを答えと考えています。
マイケル

1
または、ファイルに直接保存しtree > file_structure.txtます。これはUnixシステムで機能することを私は知っています。Windowsでも動作するかどうかはわかりません。
Lucio Mollinedo 2016

19

Graphviz -Webページから:

Graphvizレイアウトプログラムは、単純なテキスト言語でグラフの説明を取り、Webページ用の画像やSVG、PDFやその他のドキュメントに含めるためのPostscriptなどのいくつかの便利な形式で図を作成します。またはインタラクティブなグラフブラウザで表示します。(Graphvizは、XML方言であるGXLもサポートしています。)

これは、さまざまなボックスと線の図を作成するために私が見つけた最も単純で生産性の高いツールです。私はVisioとOmniGraffleを使用していますが、「もう1つ調整する」という誘惑が常にあります。

Graphizが使用する「ドットファイル」形式を生成するコードを作成することも非常に簡単であるため、自動化された図の生成も簡単に実行できます。


5

約束通り、これが私のカイロバージョンです。lfsを使用してディレクトリをウォークし、Luaでスクリプトを作成しました。私はこれらの小さな課題が大好きです。かなり長い間掘り下げたかったAPIを探索できるからです...
lfsとLuaCairoはどちらもクロスプラットフォームなので、他のシステムでも動作するはずです(フランスのWinXP Pro SP3でテスト済み)。

木を歩きながら、最初のバージョンの描画ファイル名を作成しました。利点:メモリのオーバーヘッドがありません。不便:事前に画像サイズを指定する必要があるため、掲載が途切れる可能性があります。

そこで、このバージョンを作成しました。最初にディレクトリツリーをたどり、Luaテーブルに保存しました。次に、ファイルの数を知り、(少なくとも垂直に)収まるようにキャンバスを作成し、名前を描画します。
PNGレンダリングとSVGレンダリングを簡単に切り替えることができます。後者の問題: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")

もちろん、スタイルを変更することもできます。私は接続線を描きませんでした、私はそれを必要に応じて見ませんでした。オプションで後で追加するかもしれません。


3

Windowsファイルシステムでファイル構造を作成して目的の名前を入力し、HyperSnap(またはユビキタスなAlt-PrtScr)などのスクリーングラバーを使用してエクスプローラーウィンドウのセクションをキャプチャできないのはなぜですか。

これは、折りたたみ可能なセクションを持つインターネットアプリケーションを「デモ」するときに行いました。目的のエントリのように見えるファイルを作成するだけで済みました。

HyperSnapは少なくともJPGを提供します(おそらく他のものですが、私は調査することを気にしませんでした)。

または、エクスプローラーからアイコン+/-をスクリーンキャプチャし、MS Word Draw自体で使用して画像を作成することもできますが、MS WordDrawを適切に動作させることはできませんでした。


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

さまざまな形式をエクスポートできるCairoを使用して、別の方向性を試してみます。それはより多くの作業(位置/オフセットの計算)ですが、構造は単純で、それほど難しくないはずです。


1
Steve DeRoseは、ファイル構造を作成するPerlscriptを持っています-> derose.net/steve/utilitiesに
claj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.