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.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Beitragvon shakebox » Donnerstag 19. Juni 2008, 12:48

kleine Frage noch zum Verstaendnis:
da Du jetzt nur einen Pfad als Parameter hast, gehe ich richtig in der Annahme dass das jetzt nicht kopiert sondern einen Ordner mit Dateien, der sich schon auf dem Zielvolume befindet, in eine richtige Reihenfolge bringt!?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Donnerstag 19. Juni 2008, 13:13

Genau, der Ordner bleibt im Explorer genau gleich, nur die Dateien sind auf der HD neu sortiert.

Braucht aber eine defragmentierte HD da er nur prüft ob es einen genügen grossen Block frei hat.

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

Beitragvon shakebox » Donnerstag 19. Juni 2008, 13:48

so, ersten Test gemacht, leider laeuft der nicht durch. Er geht bis zu den Zeilen

Code: Alles auswählen

cmap = ClusterMap(vmap, cluster_count)
blocks = BlockMap(cmap)


die erste Zeile schafft er noch, aber beim Aufruf der zweiten Zeile steigt er mir dann mit folgender Meldung aus:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 213, in <module>
main()
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 190, in main
blocks = BlockMap(cmap)
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 45, in __init__
list.__init__()
TypeError: descriptor '__init__' of 'list' object needs an argument


Ne Idee, was das sein koennte? Stimmt da was bei mir in meiner Pythonconfig nicht, oder ist da wirklich im Code noch was faul? Danke!
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Beitragvon shakebox » Donnerstag 19. Juni 2008, 14:41

ok, ich hab mich jetzt mal getraut, die Zeile

Code: Alles auswählen

list.__init__()


umzuaendern in

Code: Alles auswählen

list.__init__(self)


und prompt funktioniert das Ganze. Hoffe ich mach damit nicht irgendwas absolut falsch/kaputt!?

Damit laeuft es auch wunderbar durch und die Sequenzen sind tatsaechlich defragmentiert. Ich bin hellauf begeistert und verbluefft! Nun muss ich das nur noch mit meinem RAID testen und dann in meinen Workflow einbauen.

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

Beitragvon shakebox » Donnerstag 19. Juni 2008, 14:48

klar, waere ja auch zu schoen gewesen, wenn das auf dem RAID genauso funktioniert haette :) Denke da ist das nicht so einfach. Auf jeden Fall bekomme ich da folgende Meldung:

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: (6L, 'ERROR_INVALID_HANDLE')
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Donnerstag 19. Juni 2008, 16:12

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

Beitragvon shakebox » Freitag 20. Juni 2008, 07:59

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:

Beitragvon rayo » Freitag 20. Juni 2008, 08:38

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

Beitragvon shakebox » Freitag 20. Juni 2008, 09:39

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

Beitragvon shakebox » Freitag 20. Juni 2008, 09:47

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:

Beitragvon rayo » Freitag 20. Juni 2008, 09:51

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

Beitragvon shakebox » Freitag 20. Juni 2008, 10:17

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:

Beitragvon rayo » Freitag 20. Juni 2008, 10:22

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

Beitragvon shakebox » Freitag 20. Juni 2008, 10:36

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:

Beitragvon rayo » Freitag 20. Juni 2008, 10:53

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

Wer ist online?

Mitglieder in diesem Forum: de_tom