ByteChecker- Statistikspielerei
Verfasst: 30.04.2006 02:04
Hi Leute.
Zuerst mal: Wer nach sinn sucht, ist hier falsch.
Ich hatte Langeweile (bzw. hab versucht mich vom Abilernen ab zu lenken) und da viel mir ein, dass ich doch schon immer mal wissen wollte, wie wohl die Verteilung der Bytewerte auf meiner Festplatte ist, also wie oft davon ne 123, ne 34 oder ne 0 vertreten ist und was wohl der Durchschnittswert ist. Daher hab ich mir folgendes kleines Tool geschrieben. Es beachtet zwar nicht alles (zum Beispiel ist das Dateisystem ja auch wo gespeichert und so weiter) aber es geht immerhin alle Dateien durch, mit denen man arbeiten kann.
Bei mir war der Durchschnittswert 111.2, wie sieht´s bei euch aus?
Wie gesagt, es ist nur ne spielerei, aber testet´s ruhig mal aus, wenn ihr grad rechenzeit frei habt, ist interessant, wie stark sich der Wert ändern kann, wenn plötzlich nur Dateien mit hohen oder niedrigen werten kommen.
Und sagt mir mal das Ergebnis, würd mich interessieren

bis denne Antenne
Franky
Zuerst mal: Wer nach sinn sucht, ist hier falsch.
Ich hatte Langeweile (bzw. hab versucht mich vom Abilernen ab zu lenken) und da viel mir ein, dass ich doch schon immer mal wissen wollte, wie wohl die Verteilung der Bytewerte auf meiner Festplatte ist, also wie oft davon ne 123, ne 34 oder ne 0 vertreten ist und was wohl der Durchschnittswert ist. Daher hab ich mir folgendes kleines Tool geschrieben. Es beachtet zwar nicht alles (zum Beispiel ist das Dateisystem ja auch wo gespeichert und so weiter) aber es geht immerhin alle Dateien durch, mit denen man arbeiten kann.
Bei mir war der Durchschnittswert 111.2, wie sieht´s bei euch aus?
Code: Alles auswählen
Global Dim Bytes.q(255)
Global Allbytes.q
Global Buffersize.l=1000000
Global buffer.l
Global wert.l
Global Array.l=@Bytes(0)
Global mainthread.l
Global momname.s
Global Momdurchschnitt.d
Global Files.q
Global FilesWork.q
Global Didnot.q
Global maxwert.l
Procedure TestBuffer(buffer2.l,Size.l)
Protected *adr.Byte ,ende.l
size=size-1
*adr=buffer2
ende=*adr+size
Repeat
Bytes(*adr\b&$FF)+1
*adr+1
Until *adr>ende
EndProcedure
Procedure CheckFile(name.s)
menge.l=FileSize(name)
files=files+1
If ReadFile(1,name)
fileswork=fileswork+1
Allbytes=Allbytes+menge
While menge=>Buffersize
menge=menge-Buffersize
ReadData(1,buffer,Buffersize)
TestBuffer(buffer,Buffersize)
Wend
If menge>0
ReadData(1,buffer,menge)
TestBuffer(buffer,menge)
EndIf
CloseFile(1)
Else
Didnot=Didnot+menge
EndIf
EndProcedure
Procedure CheckDirectory(name.s)
Static NR.l
nr=nr+1
If ExamineDirectory(nr,name,"*.*")
While NextDirectoryEntry(nr)
If Left(DirectoryEntryName(nr),1)<>"."
momname.s=name+DirectoryEntryName(nr)
Select DirectoryEntryType(nr)
Case #PB_DirectoryEntry_Directory
CheckDirectory(name+DirectoryEntryName(nr)+"\")
Case #PB_DirectoryEntry_File
CheckFile(name+DirectoryEntryName(nr))
EndSelect
EndIf
Wend
EndIf
NR=NR-1
EndProcedure
Procedure CheckAll()
buffer=AllocateMemory(Buffersize)
SetGadgetText(3,"Bin am Rechnen")
DisableGadget(3,1)
CheckDirectory("\")
SetGadgetText(3,"Fertig")
FreeMemory(buffer)
Dim MyBytes.q(255)
CopyMemory(@Bytes(0),@MyBytes(0),2048)
max=0
For a=0 To 255
If max<MyBytes(a)
max=MyBytes(a)
maxwert=a
EndIf
Next
nummer.s=StrQ(Allbytes)
string.s=""
For a=1 To Int(Len(nummer)/3)
string.s=Mid(nummer,Len(nummer)-(a)*3,3)+"."+string
Next
If Len(nummer)%3<>0
string=Left(nummer,Len(nummer)%3)+"."+string
EndIf
nummer=string
nummer2.s=StrQ(Didnot)
string.s=""
For a=1 To Int(Len(nummer2)/3)
string.s=Mid(nummer2,Len(nummer2)-(a)*3,3)+"."+string
Next
If Len(nummer2)%3<>0
string=Left(nummer2,Len(nummer2)%3)+"."+string
EndIf
nummer2=string
durchsch.d=0
For a=0 To 255
wert2.q=a*Bytes(a)
durchsch=durchsch+wert2/Allbytes
Next
MessageRequester("Ergebnis:","Es wurden "+StrQ(FilesWork)+" Dateien mit "+nummer+" Bytes überprüft"+Chr(13)+"Der Durchschnittliche Wert betrug "+StrD(durchsch)+Chr(13)+"Es konnten "+StrQ(files-FilesWork)+" Dateien nicht geprüft werden; Gesamtgröße: "+nummer2+" Bytes"+Chr(13)+"Der häufigste Wert war "+Str(maxwert))
EndProcedure
Procedure ShowData_Mom()
Protected durchsch.d
Repeat
Dim MyBytes.q(255)
CopyMemory(@Bytes(0),@MyBytes(0),2048)
CreateImage(1,512,200)
max=0
For a=0 To 255
If max<MyBytes(a)
max=MyBytes(a)
EndIf
Next
If max>0
StartDrawing(ImageOutput(1))
FrontColor(255)
For a=0 To 255
LineXY(a*2+1,200,a*2+1,200-(MyBytes(a)*200/max))
LineXY(a*2+2,200,a*2+2,200-(MyBytes(a)*200/max))
Next
StopDrawing()
EndIf
SetGadgetState(1,ImageID(1))
nummer.s=StrQ(Allbytes)
string.s=""
For a=1 To Int(Len(nummer)/3)
string.s=Mid(nummer,Len(nummer)-(a)*3,3)+"."+string
Next
If Len(nummer)%3<>0
string=Left(nummer,Len(nummer)%3)+"."+string
EndIf
durchsch=0
For a=0 To 255
wert2.q=a*Bytes(a)
durchsch=durchsch+wert2/Allbytes
Next
SetGadgetText(2,"Gezählte Bytes: "+string)
SetGadgetText(6,momname)
SetGadgetText(7,"Durchschnittswert:"+StrD(durchsch))
Delay(100)
Until IsThread(mainthread)=0
Debug "HI"
EndProcedure
If OpenWindow(1,100,100,600,300,"Bytestatistiker")
CreateGadgetList(WindowID(1))
ImageGadget(1,0,0,512,200,0)
TextGadget(2,0,220,300,20,"Noch nix gemacht")
ButtonGadget(3,300,220,200,20,"Dann starte mal")
StringGadget(6,0,240,600,20,"")
TextGadget(7,0,260,600,20,"Durchschnittswert: 0")
TextGadget(4,0,280,200,20,"X:0")
TextGadget(5,200,280,200,20,"Y:0")
Repeat
event=WaitWindowEvent()
If event=#PB_Event_Gadget And EventGadget()=3
mainthread=CreateThread(@CheckAll(),0)
neben=CreateThread(@ShowData_Mom(),0)
EndIf
SetGadgetText(4,"X: "+Str(WindowMouseX(1)/2))
SetGadgetText(5,"y: "+Str(WindowMouseY(1)/2))
Until event=#WM_CLOSE
If IsThread(mainthread)
KillThread(mainthread)
EndIf
CloseWindow(1)
EndIf
Wie gesagt, es ist nur ne spielerei, aber testet´s ruhig mal aus, wenn ihr grad rechenzeit frei habt, ist interessant, wie stark sich der Wert ändern kann, wenn plötzlich nur Dateien mit hohen oder niedrigen werten kommen.
Und sagt mir mal das Ergebnis, würd mich interessieren
bis denne Antenne
Franky
