Hallo,
Festplatten werden auch Fragmentiert, wenn sie fast Leer sind. Eine Defragmentierung steigert die Geschwindigkeit und erhöht die Lebensdauer. Dass Fehler durch starke Fragmentierung ausgelöst werden, hab ich bisher noch nicht festgestellt. Fehler können aber auftreten, wenn die Festplatte fast voll ist oder defekte Blöcke hat.
Die automatische Defragmentierung funktioniert bei mir, wird aber nur ausgeführt, wenn die Platte stark fragmentiert ist.
Beachte: Die Infos werden in der Registry auch aktualisiert, wenn nur eine Analyse durchgeführt wird.
Die Infos aus der Registry kann man mit folgendem Programm auslesen:
Dies ist kein VB6 Programm, da ich schon seit 10 Jahren nicht mehr mit VB6 arbeite.
Ist aber mit ein paar Änderungen auch in VB6 möglich. Bestimmt kann dir jemand dabei helfen.
Bei einem 64-bit System musst du die Werte auch aus der 64-bit Registry lesen.
Hier werden alle Festplatten ermittelt und mit Buchstabe und Bezeichnung in eine Listbox eingetragen.
Durch Anklicken eines Eintrags, wird die GUID ermittelt, alle Informationen gelesen und in einer Textbox angezeigt.
Imports System.IO
Imports System.Text
Imports Microsoft.Win32
Imports System.Runtime.InteropServices
Class HauptForm
<DllImport("Kernel32.dll", SetLastError:=True)>
Private Shared Function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint _
As String, <Out> lpszVolumeName As StringBuilder, cchBufferLength As _
UInteger) As Boolean
End Function
''' <summary>
''' Alle Festplatten.
''' </summary>
Dim HardDrives As DriveInfo()
Private Sub HauptForm_Load(sender As Object, e As EventArgs) Handles _
MyBase.Load
'Anzeige der vorhandenen Festplatten in einer Listbox (Buchstabe u.
' Bezeichnung).
HardDrives = DriveInfo.GetDrives.Where(Function(x) x.DriveType = _
DriveType.Fixed).ToArray
For Each di In HardDrives
Me.DriveListBox.Items.Add(String.Format("{0} {1}", di.Name, _
di.VolumeLabel))
Next
End Sub
Private Sub DriveListBox_SelectedIndexChanged(sender As Object, e As _
EventArgs) Handles DriveListBox.SelectedIndexChanged
LeseRegistry(HardDrives(Me.DriveListBox.SelectedIndex))
End Sub
''' <summary>
''' Liefert die Guid des angegebenen Laufwerks als:
''' Volume{2ed40sa2-3b6a-12e3-bac5-be6ca7a38a13}
''' </summary>
''' <param name="lw">Der Laufwerksname (C:\).</param>
''' <returns>Volume+Guid</returns>
Private Shared Function GetDriveGuid(lw As String) As String
Const maxLen = 100
Dim sb As New StringBuilder(maxLen)
' Die Volume GUID abrufen
' "\\?\Volume{2ed40sa2-3b6a-12e3-bac5-be6ca7a38a13}\"
If Not GetVolumeNameForVolumeMountPoint(lw, sb, CUInt(maxLen)) Then
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error)
End If
Return sb.ToString.Substring(4, 44)
End Function
''' <summary>
''' Liest alle Defrag-Informationen aus der Registry.
''' </summary>
''' <param name="drive">Das Laufwerk</param>
Private Sub LeseRegistry(drive As DriveInfo)
Dim g = GetDriveGuid(drive.Name)
Dim bk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, _
RegistryView.Registry64)
Dim RegPfad = Path.Combine("Software\Microsoft\Dfrg\Statistics", g)
Dim sk = bk.OpenSubKey(RegPfad)
'------------------------------------
Dim sb As New StringBuilder()
For Each valueName As String In sk.GetValueNames()
Dim value = sk.GetValue(valueName)
If TypeOf value Is Byte() Then
Dim ba = CType(value, Byte())
sb.AppendLine(String.Format("{0,-30}: {1}", valueName, GetDate(ba)))
Else
sb.AppendLine(String.Format("{0,-30}: {1}", valueName, value))
End If
Next
sk.Close()
bk.Close()
Me.InfoTextBox.Text = sb.ToString
End Sub
''' <summary>
''' Liefert das Datum aus dem Byte-Array von LastRunTime.
''' </summary>
''' <param name="bin">Byte-Array</param>
''' <returns>Datum und Zeit</returns>
Private Shared Function GetDate(bin As Byte()) As Date
If bin Is Nothing OrElse bin.Length <> 16 Then Throw New ArgumentException
Return New Date(bin(0) + bin(1) * &H100, bin(2), bin(6), bin(8), bin(10), _
bin(12))
End Function
End Class |