Memory Maker
Verfasst: Samstag 21. Mai 2011, 20:45
Ein sinnvolleres Projekt als beim letzten mal, wieder einmal in 3.x. Es findet doppelte Dateien und löscht sie, die Geschwindigkeit finde ich akzeptabel, bei vielen Doppelten Dateien kann das aber lange dauern.
Hier das schlecht geschriebene Modul:
Und der GUI dazu:
Oh, und Entschuldigung hin voraus.

Hier das schlecht geschriebene Modul:
Code: Alles auswählen
import os
import os.path
import filecmp
allfiles = {}
doublefiles = []
def scandirectory(path):
for root,dirs,files in os.walk(path):
for file in files:
if os.path.splitext(file)[1] not in allfiles.keys():
allfiles[os.path.splitext(file)[1]] = []
allfiles[os.path.splitext(file)[1]].append([os.path.getsize(os.path.join(root, file)), os.path.join(root, file)])
def finddoublefiles():
run_again = False
for filetype in allfiles:
for file in allfiles[filetype]:
to_check_file = file
for i in range(len(allfiles[filetype])):
file = allfiles[filetype][i]
if not to_check_file == file and to_check_file[0] == file[0]:
if filecmp.cmp(to_check_file[1], file[1]):
doublefiles.append(file[1])
allfiles[filetype].remove(file)
run_again = True
break
if run_again:
break
if run_again:
break
if run_again:
finddoublefiles()
def deletedoublefiles():
for file in doublefiles:
os.remove(file)
def resetfilelist():
global allfiles, doublefiles
allfiles = {}
doublefiles = []
Code: Alles auswählen
import tkinter
import tkinter.filedialog as filedialog
import tkinter.messagebox as messagebox
import memorymaker
import os
window = tkinter.Tk()
window.title('Memory Maker')
tkinter.Label(window, text='Startus:').grid(row=0, column=0, sticky='e')
startuslabel = tkinter.Label(window, text='Keine Aktionen verbleibend', width=50, fg='black', bg='#00ffff', font=('bold'))
startuslabel.grid(row=0, column=1, sticky='w')
infolabel = tkinter.Label(window, text='Alles OK', width=50, fg='black', bg='green', font=('bold'))
infolabel.grid(row=0, column=1, sticky='e')
tkinter.Label(window, text='Info:').grid(row=0, column=1)
doublefile_listbox = tkinter.Listbox(window, width=157, height=47)
doublefile_listbox.grid(row=1, column=1)
scrollbar = tkinter.Scrollbar(window)
scrollbar.grid(row=1, column=2, sticky='S'+'N')
doublefile_listbox.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=doublefile_listbox.yview)
def appendpath():
path = filedialog.askdirectory()
if path != '':
startuslabel.config(text='Verzeichnis wird gescannt.')
window.update_idletasks()
memorymaker.scandirectory(path)
startuslabel.config(text='Keine Aktionen verbleibend')
infolabel.config(text='Es wurde noch nicht nach Doppelten Dateien Gesucht.', bg='#ffff00')
def finddoublefiles():
startuslabel.config(text='Suche nach Doppelten Dateien.')
window.update_idletasks()
memorymaker.doublefiles = [] #notwendig um die listbox nicht löschen zu müssen.
try:
memorymaker.finddoublefiles()
for path in memorymaker.doublefiles:
doublefile_listbox.insert('end', path)
except IOError:
infolabel.config(text='Datei Zugriffs Fehler', bg='#ff0000')
else:
startuslabel.config(text='Keine Aktionen verbleibend')
infolabel.config(text='Alles OK', bg='#00ff00')
def resetall():
if messagebox.askyesno('Memory Maker', 'Alle Datei-Informationen gehen verlorren!'):
memorymaker.resetfilelist()
doublefile_listbox.delete(0, 'end')
def deletedoublefiles():
if messagebox.askyesno('Memory Maker', 'Dateien wirklich löschen?'):
try:
for path in doublefile_listbox.get(0, 'end'):
os.remove(path)
except:
infolabel.config(text='Datei Zugriffs Fehler', bg='#ff0000')
else:
doublefile_listbox.delete(0, 'end')
def clearmessagelabel():
infolabel.config(text='Alles OK', bg='#00ff00')
tkinter.Button(window, text='Entfernen',
command=lambda doublefile_listbox=doublefile_listbox: \
doublefile_listbox.delete(tkinter.ANCHOR)).grid(row=1, column=0, sticky='s'+'n'+'e'+'w')
menubar = tkinter.Menu(window)
filemenu = tkinter.Menu(menubar)
filemenu.add_command(label='Verzeichnis Scannen', command=appendpath)
filemenu.add_command(label='Doppelte Dateien Suchen', command=finddoublefiles)
filemenu.add_separator()
filemenu.add_command(label='Zurücksetzen', command=resetall)
filemenu.add_separator()
filemenu.add_command(label='Doppelte Dateien Löschen', command=deletedoublefiles)
filemenu.add_separator()
filemenu.add_command(label='Beenden', command=window.destroy)
menubar.add_cascade(label='Datei', menu=filemenu)
menubar.add_command(label='Nachricht gelessen', command=clearmessagelabel)
window.config(menu=menubar)
tkinter.mainloop()