ما الأداة التي يجب استخدامها لرسم مخطط شجرة الملفات [مغلق]

StackOverflow https://stackoverflow.com/questions/347551

سؤال

بالنظر إلى شجرة الملفات - دليل يحتوي على أدلة وما إلى ذلك، كيف يمكنك كتابة برنامج نصي لإنشاء رسم تخطيطي لشجرة الملفات كملف رسومي يمكنني تضمينه في مستند معالج النصوص.أفضل الملفات المتجهة (SVG، EPS، EMF...).يجب أن تعمل الأداة على نظام التشغيل Windows، ولكن يفضل أن تكون مشتركة بين الأنظمة الأساسية.قد تكون الأداة تجارية ولكن يفضل أن تكون مجانية.

تحديث 2012-02-20.كان السؤال متعلقًا بمشروع فرعي للتوثيق.كان علي أن أشرح مكان وجود الملفات (خاصة الموارد وملفات التكوين).انتهى بي الأمر باستخدام أمر شجرة dos.لقد حصلت على النتيجة على الشاشتين (للمجلدات القصيرة) وبالنسبة للمجلدات الأطول قمت بإعادة توجيهها إلى ملف نصي، ثم قمت بتحريره بعد ذلك.على سبيل المثال، إذا كان المجلد الفرعي يحتوي على 20 ملفًا مكتوبًا بشكل مماثل ولم تكن كل منها على حدة مهمة بالنسبة للنقطة التي كنت أطرحها، فقد تركت ملفين فقط واستبدلت الباقي بملف واحد...خط.قمت بعد ذلك بطباعة الملف على وحدة التحكم مرة أخرى والتقطته الشاشة.قبل التقاط الشاشة، كان عليّ تعديل اللون الأمامي إلى الأسود ولون الخلفية إلى الأبيض، لتبدو أفضل ولحفظ الحبر في المستند في حالة طباعته.

ومن المدهش جدًا أنه لا توجد أداة أفضل لذلك.إذا كان لدي الوقت، كنت سأكتب ملحق Visio أو ربما أكتب سطر أوامر ينتج SVG.نظرًا لكون SVG دون المستوى القياسي لـ HTML5، فإنه سيسمح بتضمينها بسهولة في الوثائق عبر الإنترنت.

تحديث 2017-10-17.يؤسفني إزالة هذا السؤال لأنه لا ينتمي إلى SO.لذا فقد قمت بإعادة صياغتها.أحتاج إلى برنامج نصي - وليس WYSIWYG أيضًا.لذا فإن أي لغة برمجة نصية أو مكتبة على ما يرام.لذا فهو سؤال يتعلق بكتابة التعليمات البرمجية، وأعتقد أنه ينتمي إلى SO.

هل كانت مفيدة؟

المحلول

النسخ واللصق من 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 يُستخدم مع صفحات الرموز التي لا تدعم الأحرف الرسومية ولإرسال المخرجات إلى الطابعات التي لا تفسر الأحرف الرسومية بشكل صحيح.

نصائح أخرى

Graphviz - من صفحة الويب:

<اقتباس فقرة>   

والبرامج تخطيط Graphviz تأخذ أوصاف الرسوم البيانية في لغة نصية بسيطة، وجعل الرسوم البيانية في العديد من الأشكال المفيدة مثل الصور وSVG لصفحات الويب، التذييل لإدراجها في PDF أو غيرها من الوثائق؛ أو عرض في مستعرض الرسم البياني التفاعلي. (Graphviz كما يدعم GXL، وهي لهجة XML).

وانها أداة أبسط وأكثر إنتاجية لقد وجدت لخلق مجموعة متنوعة من صناديق وخطوط الرسوم البيانية. لدي واستخدام Visio وOmniGraffle، ولكن هناك دائما إغراء لجعل "أكثر واحد فقط تعديل".

وكما انه من السهل جدا لكتابة التعليمات البرمجية لإنتاج شكل "دوت ملف" التي تستهلك Graphiz والإنتاج المخطط الآلي وذلك هو أيضا بشكل جيد في متناول اليد.

وكما وعدت، وهنا هو بلدي النسخة القاهرة. I كتابتها مع لوا، وذلك باستخدام الدراسة الاستقصائية على المشي الدلائل. أنا أحب هذه التحديات قليلا، لأنها تسمح لي لاستكشاف واجهات برمجة التطبيقات أردت أن حفر لبعض الوقت ...
LFS وLuaCairo على حد سواء عبر منصة، لذلك يجب أن تعمل على أنظمة أخرى (اختبار على ويندوز إكس بي برو SP3 الفرنسي).

وأنا قدمت النسخة الأولى رسم أسماء الملفات ومشيت الشجرة. ميزة: لا النفقات العامة الذاكرة. إزعاج: لدي لتحديد حجم الصورة مسبقا، لذلك من المرجح أن يتم قطع قوائم

.

وفصنعت هذا الإصدار، أولا المشي شجرة الدليل وتخزينه في جدول لوا. ثم، ومعرفة عدد الملفات، وخلق قماش لتناسب (على الأقل عموديا) ورسم الأسماء.
يمكنك التبديل بسهولة بين PNG تقديم وSVG واحد. المشكلة مع هذا الأخير: القاهرة يولد ذلك على مستوى منخفض، ورسم الحروف بدلا من استخدام قدرة النص SVG ل. حسنا، على الأقل، فإنه يضمن تدمى دقيقة حتى على الأنظمة دون الخط. لكن الملفات هي أكبر ... ليست في الحقيقة مشكلة إذا ضغط عليه بعد، أن يكون ملف .svgz.
أو أنه لا ينبغي أن يكون من الصعب جدا لتوليد SVG مباشرة، كنت لوا لتوليد 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")

وبطبيعة الحال، يمكنك تغيير الأنماط. لم أكن رسم خطوط اتصال، لم أكن رأيت ذلك ضروريا. وأود أن أضيف لهم اختياريا لاحقا.

وماذا يمكن أن لا مجرد تقديم بنية الملف على نظام الملفات ويندوز وملء مع أسماء المطلوب، ثم استخدام المختطف الشاشة مثل HyperSnap (أو في كل مكان على Alt-برتسكر) لالتقاط جزء من إطار مستكشف.

وفعلت ذلك عندما 'demoing "تطبيق الانترنت التي سيكون لها أبواب قابلة للطي، أود فقط أن إنشاء ملفات يشبه مداخل بلدي المرجوة.

وHyperSnap يعطي و .JPG على الأقل (وربما غيرها ولكن لقد ازعجت ابدا للتحقيق).

وأو هل يمكن أن الشاشة التقاط الرموز +/- من مستكشف واستخدامها في مايكروسوفت وورد رسم نفسه للقيام صورتك، ولكن لم أكن قادرة على الحصول على مايكروسوفت وورد رسم على التصرف نفسه بشكل صحيح.

وأما النصيحة لاستخدام Graphviz هو جيد: يمكنك إنشاء ملف نقطة وانها لن تفعل العمل الشاق لقياس السلاسل، والقيام التخطيط، وما إلى ذلك بالإضافة إلى أنه يمكن إخراج الرسوم البيانية في الكثير من الأشكال، بما في ذلك ناقلات <. / P>

ولقد وجدت برنامج بيرل تفعل ذلك على وجه التحديد، في قائمة بريدية، ولكن أنا فقط لا يمكن العثور عليه مرة أخرى! أنا نسخ ملف عينة نقطة ودرس عليه، لأنني لا أعرف الكثير من بناء الجملة هذا التعريفي، وأردت أن تتعلم أكثر قليلا.

المشكلة: مع أحدث 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

وسأحاول اتجاه آخر، وذلك باستخدام القاهرة، والتي هي أيضا قادرة على تصدير عدد من الأشكال. ومن أكثر الأعمال (الحوسبة مواقف / التعويضات) ولكن هيكل بسيط، لا ينبغي أن يكون صعبا للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top