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?
Bildsequenzen "defragmentiert" kopieren?
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 hat geschrieben:Laut MSDN muss man Administratorrechte haben, hast du das auf der RAID-Maschine?
-
- 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
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
ja, das passt alles. Ich hab es verfolgt bis in die Funktion:
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.
Code: Alles auswählen
def get_cluster_size(volume):
return get_disk_size(volume)/defrag.get_volume_map(volume)[1]
Ich versuch mal ob ich mich mit print-Tests noch weiter durchhangeln kann.
hab es jetzt hierauf eingegrenzt:
da kommt als result wohl 0 raus, was dann ja unten den Error 'raised', oder?
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()])
hm, weiss nicht ganz genau was Du meinst.
Wenn ich 'print handle' eingebe bekomme ich folgenden Output:
PS: Hier noch die Werte der anderen Variablen:
Wenn ich 'print handle' eingebe bekomme ich folgenden Output:
Hilft Dir das?4294967295
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)
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Änder in der Funktion open_volume mal:
in
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
Änder in der Funktion open_volume mal:
Code: Alles auswählen
if handle == -1:
Code: Alles auswählen
if handle == 0xffffffff:
Vielleicht gibts da einen besseren Fehler.
Gruss
stimmt, das ergibt am Ende des Tracebacks ne neue Fehlermeldung:
Wenn ich versuche, diese Freigabe wegzumachen bekomme ich eine Warnmeldung:
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.
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".defrag_api.OpenVolumeException: (32L, 'ERROR_SHARING_VIOLATION')
Wenn ich versuche, diese Freigabe wegzumachen bekomme ich eine Warnmeldung:
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.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?
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.
-
- 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:
wenn das nicht geht noch FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE probieren:
Gruss
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)
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)
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')
-
- 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:
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
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)
Kling auf jeden Fall so, also könnte es nacher funktionieren.
Gruss
-
- 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
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
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.
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.
-
- 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
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
- 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
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.