lunar hat geschrieben:@Liffi: Der OP hat nicht von Zeit gesprochen. Eine prozentuale Anzeige des Fortschritts kann sich auch beziehen auf die Anzahl der bereits kopierten Bytes im Verhältnis zur Gesamtgröße aller zu kopierenden Dateien. Eine solche Anzeige ist relativ zuverlässig.
Aber die Anzeige ist doch nur brauchbar, wenn die Dateigroesse relativ homogen ist.
Ansonsten hilft einem die Anzeige '75%' recht wenig, wenn das noch dreimal so lange dauert wie die ersten 75%.
EDIT:: Trotzdem kann es natuerlich sinnvoll sein, so etwas zu tun. Benutzer heute denken ja sofort es ist etwas kaputt, wenn sich nichts bewegt oder dreht.
1) Alles Verzeichnisse inkl. Unterverzeichnisse auf Dateien durchsuchen und Größe addieren in bsp SummeDatein?
(Da ist schon die erste Frage, wie durchsuche ich Unterverzeichnisse in n Ebenen?)
2) Dann kopiere ich in einem Zweiten Durchlauf die Verzeichnisse und Datein? (Dateien ist klar, aber wie kopiere ich eine komplette Verzeichnisstruktur?) Zudem addiere ich jede kopierte Dateigröße auf bsp SummeKopie und lasse mir dann die Differenz in Prozent zu SummeDatein anzeigen.
Kann ich das vergleichen in einem eigenen Prozess laufen lassen (-- Subprozess?), der quasi einmal die Sek. ausgeführt wird?
Zu 2) Na Du fängst einfach auf der obersten Ebene an und kopierst alle Dateien. Dann legst Du alle Verzeichnisse in der Ebene an und kopierst da dann die Dateien hinein und so weiter. Also Du gehst alle Dateien und Verzeichnisse der Quelle durch. Siehe 1).
Letztendlich kannst Du Dir in Schritt eins die Daten auch alle merken.
Von Unterprozessen (oder Threads) würde ich hier die Finger lassen, das ist unnötige Komplexität. Du müsstest Deine Kopierfunktion einfach nur eine Rückruffunktion übergeben können, mit der man den Fortschritt irgend wo hin melden kann.
#!/usr/bin/python
import os
def iter_files(path):
files = []
for root, dirs, filenames in os.walk(path):
for filename in filenames:
files.append(os.path.join(root, filename))
return files
def get_dir_size(directory):
files = iter_files(directory)
dir_size = 0
for file in files:
dir_size += os.path.getsize(file)
return dir_size
dirname = r'D:\____Test\Test'
print get_dir_size(dirname)
Gibt mir die tatsächliche Dateigröße aus. Nun gibt es ja bei Windows 'Dateigröße' und 'Größe auf Datenträger'. Das hat wohl was mit dem Cluster der Platte zu tun (http://www.fachinformatiker.de/windows- ... aeger.html) Ist diese immer 512, kann ich den auslesen? Wenn ich schonmal die Größe habe, kann ich in meinem Skript auch direkt prüfen ob die kopierenden Dateien ins Zielverzeichnisspassen (kann ich auch freien Speicherplatz auslesen???).
@JohnWorks: Diese Überprüfung würde ich an Deiner Stelle vergessen. Da spielen einfach zu viele Faktoren mit hinein. Es gibt verschiedene Dateisysteme, transparente Kompression, "sparse files", und die Verzeichniseinträge nehmen ja auch noch einmal nicht wirklich vorhersehbaren Speicherplatz auf dem Datenträger ein.
BlackJack hat geschrieben:@JohnWorks: Diese Überprüfung würde ich an Deiner Stelle vergessen. Da spielen einfach zu viele Faktoren mit hinein. Es gibt verschiedene Dateisysteme, transparente Kompression, "sparse files", und die Verzeichniseinträge nehmen ja auch noch einmal nicht wirklich vorhersehbaren Speicherplatz auf dem Datenträger ein.
OK, vielleicht wäre die "einfache Möglichkeit" die Summe der Daten um 1% zu erhöhen?! Einen Tipp zu den Konfigurationsdaten, wie ich die am besten auslager?!