Eigene File-Defragmentierung umsetzen für NTFS


#1

Hallo,

ich schreib erst mal ein bisschen BlaBla:
als Silvester Aufgabe hab ich mir gesetzt, eine Art Defragmentierung zu schreiben. Nun ist es schon Silvestermittag, es verbleiben noch weniger 12 Stunden, und 12 Stunden hab ich dafür als (untere?) Schranke einkalkuliert.
Ich hätte auch schon eine Idee, aber bei der Umsetzung sehr schwierig.

Und jetzt kein BlaBla mehr:
Ich kann (in Java) freien Speicherplatz allozieren/reservieren, Files “umschreiben”, aber z. B. nicht nicht alle Attribute kopieren.
Java scheint in dem Fall für die low level disc accesses usw. auch nicht das richtig Werkzeug zu sein. Ich hab natürlich gegoogelt, aber Microsoft stellt sich das ungefähr so vor: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363911(v=vs.85).aspx#defragmenting_a_file .

Kann ich irgendwie, über JNI, diese FSCTL_GET_VOLUME_BITMAP usw. inkludieren?

Das Problem ist, dass ich die Files lesen, löschen, schreiben kann, aber dann alle Attribute anders sind. Die File Eigenschaften müssen ja 1:1 bleiben.

Weiterhin wollte ich schon vermeiden, mich so weit mit dem NTFS auseinanderzusetzen - oder gar händisch dort etwas zu machen. :face_with_raised_eyebrow:

Könnt ihr ein paar Tipps geben, welche Sprache, welche Bibs usw. usf.?


#2

Es geht darum, kleine Dateien in einem Stück an den Anfang der Partition zu verschieben (konsolidieren?), um Defragmentierung vorzubeugen und um Speicherplatz zu gewinnen.

Dazu nutze ich: https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html#setLength(long) um Speicherplatz in einem Stück relativ am Anfang der Partition zu setzen, und https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html#read(byte[]) und https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html#readFully(byte[]) zum Lesen, und die entsprechenden Schreib-Methoden zum Schreiben.

Problem: Das ist nicht 1:1 low level copy… Weiter an NTFS komm ich wahrscheinlich ohne die obigen C Methoden nicht ran, oder?