Laden...

Defragmentieren in .NET

Erstellt von ec-hasslau.de vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.952 Views
ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 17 Jahren
Defragmentieren in .NET

Hallo Leute.

Hab heut mal bisschen rumgesucht und einige Artikel über Defragmentieren gefunden.
Aber irgendwie wiedersprechen die sich ein wenig, weshalb ich nachfragen wollte, ob jmd weiß, was denn nun richtig ist.

Es geht um folgendes:1.http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/defragmenting_files.asp
hier steht unter anderem "The control codes also transparently handle the problem of inhibiting and allowing other processes to read from and write to files during moves.", was für mich heißt, dass man kein problem mit gleichzeitigen Zugriffen haben sollte

1.http://blogs.msdn.com/jeffrey_wall/archive/2004/09/13/229137.aspx
hier steht dafür aber "Here's the whole thing, nearly guaranteed to break your file system if used. 🙂"

Ich bin verwirrt, weil beides die selben Funktionen verwendet, will es aber nicht unbedingt testen, welcher Artikel von beiden Recht hat. Hoffe ihr könnt mir Antwort geben.

Gruß, ec-hasslau.de

PS: Ich wäre auch nicht abgeneigt eine ganz andere Möglichkeit in Betracht zu ziehen...

S
8.746 Beiträge seit 2005
vor 17 Jahren

Der zweite Satz ist ein wenig ironisch gemeint. Die C#-Lib kapselt die Low-Level-Routinen der Defragmenter API. Wenn man die falsch nutzt, dann ist die FS in der Hose.

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 17 Jahren

Was heißt "falsch nutzt"? Wenn ich die Klasse so verwende wie sie ist, nutze ich es dann falsch?

S
8.746 Beiträge seit 2005
vor 17 Jahren

Du musst z.B. den In und den Out-Cluster angeben. Wenn du da falsche Werte angibst, dann ist dein FS zerschossen.

M
456 Beiträge seit 2004
vor 17 Jahren

@svenson
Ich glaube du liegst da ein bissl falsch. Der Dateisystem-Treiber sorgt dafür, dass nach einem FILE_MOVE Kommando per DeviceIoControl, das Dateisystem immer in einem konsistenten Zustand bleibt. Schließlich werden nur Cluster verschoben und die Verküpfungsinformationen werden dabei automatisch angepasst.
Hier ein interessanter Artikel dazu (Nutzt die Nt-API direkt):
http://www.rheumanet.org/Uploads/content/m1/k2/k21/doc/20204120.pdf

Es dürfte also relativ einfach sein eigene Defrag-Tools zu schreiben. Zumindest wünsche ich ec-hasslau.de viel Erfolg dabei 😉

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 17 Jahren

Gut, ich hab mich erstmal auf das anzeigen, der existierenden Cluster beschränkt. Das funzt echt gut, geht prima.
Mir fehlt aber noch so bisschen die Idee, wie man das am optimalsten ausgeben könnte. Ich hab meine jetztigen Versuche so bisschen an große Defragmentieren angelehnt (also, so in Boxen unterteilt).
Ich realisiere dass so, dass ich für jeden Block (ca 1000 Cluster) ein einzelnes Panel erstelle und dann je nach Belegung oder net die Farbe änder. Dummerweise dauert die Erstellung von mehreren 100 Paneln relativ lang.
Gibt es ein Control was für meine Verwendung besser geeignet wäre? Am besten eins, wo man gleich die Blocks bei evtl späterer Defragmentierung gezielter ansprechen kann, als bei 100en einzelnen Panels.

Gruß, ec-hasslau.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo ec-hasslau.de,

Optimierungsideen ?

herbivore

S
8.746 Beiträge seit 2005
vor 17 Jahren

Original von maxE
@svenson
Ich glaube du liegst da ein bissl falsch.

Garantiert, keine Checke von der Defrag API. Aber spannendes Thema. Interessant, dass überhaupt Leute Geld für nen Defragmentierer ausgeben, bei der API.

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 17 Jahren

Original von svenson
Garantiert, keine Checke von der Defrag API. Aber spannendes Thema. Interessant, dass überhaupt Leute Geld für nen Defragmentierer ausgeben, bei der API.

Hab mich auch schon gefragt, warum es dazu kein OpenSource-Porjekt gibt. Mit dieser API ist das ja voll simpel. Das einzige, was noch mit mehr Aufwand verbunden ist, den Algorithmus zu finden, der am optimalsten die Fragmente sortiert.

In dem Beispielcode, der dort auf der Seite war, gab es ja nur die drei Funktionen. Gibt es da noch mehr dazu?

EDIT:
Ach noch was. Bin nicht so der API-Checker. Kenn das nur noch aus VB. Wie kann man die in C# einbinden bzw. nutzen. In dem Beispiel seh ich nicht ganz durch.

Gruß, ec-hasslau.de

I
1.739 Beiträge seit 2005
vor 17 Jahren

@Svenson:

Api - Frage

Fs-Killen, geht tatsächlich über die API?

Getestet?, Würde mich schon interessieren, da diese Funktionen schon missbraucht habe - und meinen Code vielleicht anders Einstufen lassen sollte.
(VB-Import)

M
456 Beiträge seit 2004
vor 17 Jahren

@ikaros
Nein, geht nicht. Siehe mein Post oben.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 17 Jahren

Irgendwie komm ich net weiter...
Wenn ich mir die Cluster einer Datei ausgeben lasse bekomm ich eine Int64 Zahl zurückgegeben. Wie bekomm ich aus dieser Zahl meine Cluster?

Bei O&O-Defrag anschauen in welchem Cluster welche Datei gespeichert ist: Dort steht, dass im Cluster 1 "c:\boot.ini" liegt.
Wenn ich jetzt mit der API-Funktion nach der "C:\boot.ini" suche:

Array FileMap = IOWrapper.GetFileMap(@"c:\boot.ini");
foreach(Int64 test in FileMap)
{
MessageBox.Show(test.ToString());
}

bekomme ich folgendes:
MessageBox1 --> 4294967296
MessageBox2 --> 4294967296

Was muss ich nun mit diesen Zahlen tun um daraus meine Cluster "auszurechnen"?

PS: Die Klasse IOWrapper ist aus dem zweiten Link meines ersten Beitrags.

Gruß, ec-hasslau.de

ec-hasslau.de Themenstarter:in
69 Beiträge seit 2005
vor 17 Jahren

Morgen,

Gut, das Problem hab ich selbst rausgefunden. Diese Zahl ist irgendwie ein Faktor. Wenn ich bei anderen Dateien die Int64-Zahl durch diese 4294967296 teile, komme ich immer genau auf die Start- und End-Cluster. Warum da noch so ein Faktor drin ist versteh ich aber nicht...

Aber irgendwas mache ich total anders als die großen Defragmentierer. Wenn man bei O&O analysiert, steigt der benötigte RAM um etwa 1MB. Bei mir, wenn ich nur die Cluster einlese (ohne die Blocks), auf nahezu 70MB.
Außerdem findet O&O alle Dateein mit entsprechendem Cluster in wenigen Sekunden, wenn ich bei mir alle Dateien durchgehe und die Cluster suchen lasse, dauert das ewig (hab nach 10Min gestoppt).

Hat jmd eine Idee was ich falsch mache?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo ec-hasslau.de,

Teilantwort:

Dein Faktor (bzw. Divisor) ist nichts anderes 2 hoch 32 und besagt damit wohl einfach, dass die Clusternummer in den oben 32 Bits des Int64-Werts gespeichert ist.

herbivore