--- /dev/null
+#!/usr/bin/env python
+# -*-coding: utf-8 -*-
+# vim: sw=4 ts=4 expandtab ai
+
+from os import walk
+from os.path import join, abspath, normcase, basename, isdir, getsize
+from heapq import nlargest
+import gtk ###
+
+from misc import *
+
+#==============================================================================
+
+class Control(object):
+
+ def __init__(self):
+ ignore_dirs = ['/dev', '/proc', '/sys', '/mnt']
+ start_path = '.'
+ count = 7
+ self.search_abstrac = Abstraction(ignore_dirs)
+ self.search_present = Gtk_Presentation(start_path, count, self.start_search)
+
+ def start_search(self, get_data, get_stopit, label, kill_func):
+ filelist = []
+ start_path, count = get_data()
+ search_func = self.search_abstrac.filegetter(start_path, get_stopit, label)
+ for fsize, fpath in nlargest(count, search_func):
+ filelist.append([fpath, size_hum_read(fsize), int(fsize)])
+ if not get_stopit():
+ #kill_func()
+ self.search_present.show_out_toplevel(None, 'outtable', filelist)
+
+ def run(self):
+ return self.search_present.get_toplevel()
+
+#==============================================================================
+
+class Abstraction(object):
+
+ def __init__(self, ignore_dirs):
+ self.ignore_dirs = ignore_dirs
+
+ def filegetter(self, startdir, get_stopit, label):
+ """Generator of file sizes and paths based on os.walk."""
+ # Проходим по всем папкам вглубь от заданного пути
+ self.full_dir_size = 0
+ for dirpath, dirnames, fnames in walk(startdir):
+ # Исключаем каталоги из поиска в соответствии со списком исключений
+ ignore_dirs = self.ignore_dirs
+ for ign_dir in ignore_dirs[:]:
+ for dirname in dirnames[:]:
+ if ign_dir == normcase(join(abspath(dirpath), dirname)):
+ dirnames.remove(dirname)
+ ignore_dirs.remove(ign_dir)
+
+ for fname in fnames:
+ flpath = abspath(join(dirpath, fname))
+ # Выводим текущий опрашиваемый файл в строку статуса
+ #label.set_text(flpath)
+ # обновляем окно
+ gtk.main_iteration() ###
+ # Останавливаем цикл по нажатию кнопки стоп
+ stopit = get_stopit()
+ if stopit:
+ stopit = False
+ raise StopIteration
+ # Проверяем можем ли мы определить размер файла - иначе пропускаем его
+ try:
+ # Возвращаем размер и полный путь файла
+ yield getsize(flpath), flpath
+ except OSError:
+ continue
+
+#==============================================================================
+
+class Cli_Presentation(object):
+ def __init__(self):
+ self.stopit = False
+ start_func(self.get_data, self.get_stopit, self.kill_wind)
+ pass
+
+#==============================================================================
+
+class Gtk_Presentation(object):
+
+ def __init__(self, start_path, count, start_func):
+ import gtk
+
+ # "Start path" entry
+ self.path_entry = gtk.Entry()
+ self.path_entry.set_text(start_path)
+
+ # "Files quantity" label
+ qty_label = gtk.Label('Files quantity')
+
+ # "Files quantity" spin
+ self.qty_spin = gtk.SpinButton()
+ self.qty_spin.set_numeric(True)
+ self.qty_spin.set_range(0, 65536)
+ self.qty_spin.set_increments(1, 10)
+ self.qty_spin.set_value(count)
+
+ # "Start" button
+ self.start_btn = gtk.Button('Start')
+ self.start_btn.connect('released', self.start_btn_released, start_func)
+
+ # "Stop" button
+ self.stop_btn = gtk.Button('Stop')
+ self.stop_btn.set_sensitive(False)
+ self.stop_btn.connect('clicked', self.stop_btn_clicked)
+
+ # Output selection
+ outtable_rbtn = gtk.RadioButton(None, 'Table')
+ outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, 'Diagram')
+ out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1')
+ out2_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 2')
+ out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn, out2_rbtn]
+
+ hbox = gtk.HBox(False, 4)
+ hbox.pack_start(qty_label, False, False, 0)
+ hbox.pack_start(self.qty_spin, False, False, 0)
+ hbox.pack_start(self.start_btn, False, False, 0)
+ hbox.pack_start(self.stop_btn, False, False, 0)
+ for btn in reversed(out_rbtns):
+ hbox.pack_end(btn, False, False, 0)
+
+ statusbar = gtk.Statusbar()
+ context_id = statusbar.get_context_id('Current walked file')
+ statusbar.push(context_id, 'test')
+
+ self.vbox = gtk.VBox(False, 4)
+ self.vbox.set_border_width(4)
+ self.vbox.pack_start(self.path_entry, False, False, 0)
+ self.vbox.pack_start(hbox, False, False, 0)
+ self.vbox.pack_end(statusbar, False, False, 0)
+
+# self.show_out_toplevel(None, 'outtable')
+ self.frame = gtk.Frame('Files search')
+ self.frame.add(self.vbox)
+ self.frame.show_all()
+
+ #=== Functions ============================================================
+ def start_btn_released(self, widget, start_func):
+ self.stopit = False
+ self.stop_btn.set_sensitive(True)
+ self.start_btn.set_sensitive(False)
+ start_func(self.get_data, self.get_stopit, None, None)
+
+ def stop_btn_clicked(self, widget):
+ self.stopit = True
+ self.stop_btn.set_sensitive(False)
+ self.start_btn.set_sensitive(True)
+
+ def get_data(self):
+ return self.path_entry.get_text(), int(self.qty_spin.get_value())
+
+ def get_stopit(self):
+ return self.stopit
+
+ #=== Toplevel widget for embedding to main window =========================
+ def get_toplevel(self):
+ return self.frame ###
+
+ #=== Output type selecting ================================================
+ def show_out_toplevel(self, btn, outtype, results):
+ print 'Entering <' + outtype + '> output mode...'
+ out_present = __import__('files.' + outtype, None, None, outtype)
+ toplevel = out_present.Gtk_Presentation().get_toplevel()
+ ###self.vbox.remove(self.vbox.get_children()[2])
+ #self.vbox.add(toplevel)
+ self.vbox.pack_start(toplevel)
+ print results