Bildsequenzen "defragmentiert" kopieren?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mhh warum das bei mir mit dem list.__init__() keinen Fehler gab weiss ich nicht.

Beim RAID bruacht es vielleicht ein anderes Volume Handle, da ja mehrere Disks zu einer werden. Ich such mal eni wenig ob ich da was dazu finde.

Gruss

*edit*
Laut MSDN muss man Administratorrechte haben, hast du das auf der RAID-Maschine?
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

rayo hat geschrieben:Laut MSDN muss man Administratorrechte haben, hast du das auf der RAID-Maschine?
ja, hab ich. Sonst würde es ja vermutlich auf der externen Platte auch nicht funktionieren. Ich hab das auf der gleichen Maschine mit dem gleichen Account getestet.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also ich hab ein RAID 0, habs da mal getestet und funktioniert ohne Probleme.

Hast du den Pfad richtig angegeben? Er holt aus den ersten 2 Zeichen des Pfades das Volume raus (z.B. bei C:\Windows\Temp --> C:). Stimmt das bei dir auch? Mach doch mal ein "print" nach dem Volume auslesen ganz am Anfang im main.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ja, das passt alles. Ich hab es verfolgt bis in die Funktion:

Code: Alles auswählen

def get_cluster_size(volume):
    return get_disk_size(volume)/defrag.get_volume_map(volume)[1]
das 'get_disk_size' klappt noch, das kann ich mit print ausgeben. Das Rausfinden der Volume_Map dagegen klappt dann nicht mehr.

Ich versuch mal ob ich mich mit print-Tests noch weiter durchhangeln kann.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

hab es jetzt hierauf eingegrenzt:

Code: Alles auswählen

    result = device_io_control(handle,
                               FSCTL_GET_VOLUME_BITMAP,
                               ctypes.byref(in_buffer),
                               in_size,
                               ctypes.byref(out_buffer),
                               out_size,
                               ctypes.byref(size),
                               null)

    close_handle(handle)

    if not result:
        error = get_last_error()
        raise VolumeMapException(error, errors[get_last_error()])
da kommt als result wohl 0 raus, was dann ja unten den Error 'raised', oder?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Ja der Invalid Handle Error kommt direkt vom devide_io_control.
Schau mal was im handle steht.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

hm, weiss nicht ganz genau was Du meinst.

Wenn ich 'print handle' eingebe bekomme ich folgenden Output:
4294967295
Hilft Dir das?

PS: Hier noch die Werte der anderen Variablen:
in_buffer: c_longlong(0L)
in_size: 8
out_buffer: <ctypes.c_char_Array_67108864 object at 0x009FB8A0>
out_size: 67108864
size: c_ulong(0L)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Änder in der Funktion open_volume mal:

Code: Alles auswählen

if handle == -1:
in

Code: Alles auswählen

if handle == 0xffffffff:
und schau was es dann für einen Fehler gibt. Es scheint so als würde er das Volume nicht öffnen können.

Vielleicht gibts da einen besseren Fehler.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

stimmt, das ergibt am Ende des Tracebacks ne neue Fehlermeldung:
defrag_api.OpenVolumeException: (32L, 'ERROR_SHARING_VIOLATION')
klingt ja erstmal, als waere die Platte freigegeben. Hab auch nachgeschaut in den Eigenschaften der Platte und prompt steht da dass "dieser Ordner" freigegeben ist, und zwar mit Freigabename V$ und Kommentar "Standardfreigabe".

Wenn ich versuche, diese Freigabe wegzumachen bekomme ich eine Warnmeldung:
Diese Freigabe wurde ausschließlich für Verwaltungszwecke erstellt. Die Freigabe wird wieder angezeigt, wenn der Serverdienst beendet und neu gestartet wird, oder wenn der Computer neu gestartet wird. Sind Sie sicher, dass Sie die Freigabe von V$ aufheben möchten?
Denkste das hat was miteinander zu tun oder ist die Freigabe normal und das müsste trotzdem gehen? Ich kenn mich leider mit RAIDs unter Windows nicht so gut aus. Wenn Du denkst dass das aber der Grund sein muesste, werd ich da unsere Admins nochmal fragen was es damit aufsich hat und ob man das nicht abstellen kann.

Danke!

EDIT: auch die anderen Volumes an der Kiste haben diese administrative Freigabe, nur die zum Testen angehaengte USB-Platte nicht. Keine Ahnung ob das damit zusammenhaengt oder nicht.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Nein das hat nichts mit der Freibage fürs Netzwerk zu tun.

Jetzt wird das Volume mit FILE_SHARE_WRITE geöffnet, das heisst andere Handles dürfen noch Schreiben aber nicht Lesen.

Also änder mal beim create_file Aufruf das FILE_SHARE_WRITE in FILE_SHARE_WRITE | FILE_SHARE_READ:

Code: Alles auswählen

handle = create_file('\\\\.\\'+device_name, GENERIC_READ | GENERIC_WRITE,
                         FILE_SHARE_WRITE | FILE_SHARE_READ, null, OPEN_EXISTING, 0, null)
wenn das nicht geht noch FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE probieren:

Code: Alles auswählen

handle = create_file('\\\\.\\'+device_name, GENERIC_READ | GENERIC_WRITE,
                         FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, null, OPEN_EXISTING, 0, null)
Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

egal ob mit oder ohne dem DELETE-Teil, bekomme ich folgenden gleichlautenden Traceback:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 211, in <module>
main()
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 186, in main
cluster_size = get_cluster_size(volume)
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 153, in get_cluster_size
return get_disk_size(volume)/defrag.get_volume_map(volume)[1]
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag_api.py", line 186, in get_volume_map
raise VolumeMapException(error, errors[get_last_error()])
defrag_api.VolumeMapException: (234L, 'ERROR_MORE_DATA')
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Ist das eine grosse Partition mit kleinen Clustern?

ERROR_MORE_DATA heisst dass der Buffer den ich übergebe nicht ausreicht, sprich deine Partition besteht aus mehr als 64Millionen Clustern.

Da sollte es reichen bei der Funktion get_volume_map den Buffer zu vergrössern:

Code: Alles auswählen

out_buffer = ctypes.c_buffer('\x00',64*1024*1024)
Einfach eine grössere Zahl nehmen, z.B. 128*1024*1024 ergibt daraus aber auch einen Ram-Verbrauch von 128MB.

Kling auf jeden Fall so, also könnte es nacher funktionieren.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Danke, werd ich gleich probieren. Das Volume ist halbwegs gross, hat gut 5TB. Wie man das in "Cluster" umrechnet, keine Ahnung :)

Ist denn "Cluster" das gleiche was man so als "Block" bezeichnet?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Also die Clustergrösse ist abhängig von der Grösse der Partition und dem was man Einstellt beim Formatieren.

Wenn ein Cluster z.B. 4kB gross ist, belegt jede Datei mindestens soviel, ist eine Datei kleiner ist der restliche Speicherplatz verloren. Ein Cluster ist also die kleinste Einheit die belegt werden kann.

Bei 5TB gibts natürlich eine Menge Cluster, ich hab hier ein Raid von 500GB :).

Block hab ich im Quelltext zusammenstehende Cluster die belegt oder frei sind genannt.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ok, kaum setzt man die Groesse richtig, schon funktioniert es :)

Bei der Groesse dauert die Suche nach nem passenden Block natuerlich ne Weile, aber das ist glaube ich gut verschmerzbar.

Danke Dir nochmal ganz, ganz herzlich. Sag Bescheid, wie ich mich evtl. erkenntlich zeigen kann. Wenn Du magst kannst Du mir gerne ne Adresse zukommen lassen, dann schick ich ne Flasche Wein oder sonst etwas womit man Dir ne Freude machen kann, auf den Weg.

Eine kleine Frage noch:
Die Aenderungen, die wir jetzt zu Testzwecken eingebaut haben, welche davon soll ich drin lassen und welche sinnvollerweise wieder rausnehmen? Was also hing jetzt alles an der zu kleinen Buffersize und was war wirklich sonst noch "falsch". Also ich mein die Sachen mit der FILE_SHARE_READ und mit dem 0xffffffff: usw.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also kannst du alle Änderungen drin lassen.
0xffffffff ist die korrekte Überprüfung ob das Handle gültig ist.
FILE_SHARE_READ brauchts noch zusätzlich damit das Volume geöffnet werden kann.
Grösserer Buffer brauchts für deine Partitionsgrösse.

Entschädigung ist nicht nötig :)

Gruss
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Gerade das hier gesehen: http://wiki.ubuntuusers.de/FATSort

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Das sortiert "physikalisch" die Namen im Inhaltsverzeichnis. Die Dateien selbst werden nicht angefasst, also auch nicht umsortiert und defragmentiert. Ist also für den OP ungeeignet.
Antworten