webForumDet fria alternativet

mappstorlekar

5 svar · 296 visningar · startad av pnisv97

pnisv97Medlem sedan apr. 200248 inlägg
#1

Följande kod loopar igenom undermapparna och tar fram storlek på mappen. Men jag skulle vilja ha ut Storlek på disk. Den är oftast lite högre.. :-)

Någon som vet hur man kan få fram den istället för att använda sig av: folderObject.Size ?

Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("D:\Inetpub\")
Set subFolders = folder.SubFolders
count = 1
Response.ContentType = "text/xml"
Response.Write "<?xml version=""1.0""?>" & Vbcrlf
Response.Write "<system>" & Vbcrlf
For Each folderObject in SubFolders
	Call Skriv(folderObject.Name, folderObject.Size)
	count = count + 1
Next
Response.Write "</system>" & Vbcrlf

Sub Skriv(namn, size)
	Response.Write "<webbplats id=""" & count & """>" & Vbcrlf & "<katalog>" & namn & "</katalog>" _
	& Vbcrlf & "<sizemb>" & CInt(size / 1024 / 1024) & "</sizemb>" & Vbcrlf & "</webbplats>" & Vbcrlf
End Sub

Set subFolders = Nothing
Set folder = Nothing
Set fso = Nothing

:)

PalleMedlem sedan apr. 20003 174 inlägg
#2

Så här någonting: :)

[RED]<%

Function ShowAvailableSpace(drvPath)

	Set fso = CreateObject("Scripting.FileSystemObject")
	Set d = fso.GetDrive(fso.GetDriveName(drvPath))
		ShowAvailableSpace = "<b>Disk:</b> "& UCase(drvPath) &" - "& d.VolumeName &"<br><b>Utrymme:</b> "& FormatNumber(d.AvailableSpace/1024, 0) &" Kbytes"
	Set d = Nothing
	Set fso = Nothing

End Function

Response.Write ShowAvailableSpace("c:")

%>[/RED]
nikoMedlem sedan juni 20022 599 inlägg
#3

Om du vill ha fram "Size on disk" för en mapp så måste du:

1. Kolla hur många kluster varje enskild fil upptar.
2. Gånga med klusterstorleken för den aktuella driven.
3. Summera alla filer.

Hur många kluster en fil upptar kan du inte få fram med FSO, däremot kan du ju mygla lite (och bortse från att filerna kan vara fragmenterade eller komprimerade) och helt enkelt avrunda varje fil uppåt till närmast påbörjat kluster:

const CLUSTER_SIZE_BYTES=4096 ' Ändra eventuellt.
filesizeondisk=(CInt(dinFil.size)/CLUSTER_SIZE_BYTES)+1)*CLUSTER_SIZE_BYTES

Fast annars förstår jag egentligen inte varför den informationen är särskilt intressant?

/red: Gör ett experiment och skapa en mapp med två textfiler med 1 tecken i varje. Mappens storlek är nu 2 bytes. Mappens storlek på disk är däremot 8192 bytes = 2*4096 bytes. Ser du systemet?

pnisv97Medlem sedan apr. 200248 inlägg
#4

tack för svar..

niko. Intressant idé att räkna ut klusterstorleken men det känns omöjligt. Har en mapp där size är 50mb medans size on disk är 64mb. relationen däremellan skiljer mellan olika mappar.

Men detta beror kanske på att hårddisken inte är defraggad eller liknande ??..

nikoMedlem sedan juni 20022 599 inlägg
#5

räkna ut klusterstorleken men det känns omöjligt

Att räkna ut klusterstorleken är inte omöjligt. Skapa en fil i anteckningar med 1 tecken och kolla "Size on disk". Där har du din klusterstorlek. Problemet blir ju sen att du blir tvungen att loopa över samtliga filer i alla mappar och summera, men det går ju om man vill.

Har en mapp där size är 50mb medans size on disk är 64mb. relationen däremellan skiljer mellan olika mappar.

Naturligtvis skiljer sig relationen mellan olika mappar?

Många små filer -> Stor skillnad.
Få stora filer -> Liten skillnad.

Den maximala skillnaden per fil är ju 4095 bytes och detta avrundas alltid uppåt.

Men detta beror kanske på att hårddisken inte är defraggad eller liknande ??..

Fragmentering ska nog inte vara nån större felkälla om vi inte talar våldsam fragmentering. Har du däremot NTFS-komprimering påslagen så kan du helt glömma metoden ovan.

nikoMedlem sedan juni 20022 599 inlägg
#6

Funkar perfekt hos mig:

<%
dim fso
set fso = server.createobject("scripting.filesystemobject")
lSizeOnDisk=0
const CLUSTER_SIZE=4096 ' Ändra eventuellt.

function GetSizeOnDisk(path)
	dim folder, folders, files, file
	set folder = fso.getfolder(path)
	set files = folder.files
	for each file in files
		if Fix(file.size/CLUSTER_SIZE)-file.size/CLUSTER_SIZE=0 then
			lSizeOnDisk=lSizeOnDisk+(Fix(file.size/CLUSTER_SIZE))*CLUSTER_SIZE
		else
			lSizeOnDisk=lSizeOnDisk+(Fix(file.size/CLUSTER_SIZE)+1)*CLUSTER_SIZE
		end if
	next
	set folders = folder.subfolders
	for each f in folders
		GetSizeOnDisk f.path
	next
end function

GetSizeOnDisk(Server.MapPath("/"))

response.write Server.MapPath("/") & " upptar " & lSizeOnDisk & " bytes på disk "

Set folder = fso.GetFolder(Server.MapPath("/"))
response.write "och " & folder.Size & " bytes i verkligheten.<br>"
%>

.. så helt "omöjligt" är det väl inte.

129 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)