VBScript - получить фактический размер сжатого файла NTFS.
Я заметил, что свойство "size" сжатого файла NTFS возвращает его несжатый размер, и я не могу найти способ получить фактический размер на диске.
Мне нужно это значение, чтобы узнать реальный вес определенных папок, содержащих сжатые данные.
Есть ли способ сделать это в VBS?
Спасибо!
2 ответа
Решение
Вот как вы выполняете ту же программу без необходимости искать файл по отдельности, используя "UserAccounts.CommonDialog", который больше не работает во всех ОС, также я очистил код, чтобы он отображал только размер на диске, а не любая другая избыточная информация.
Наслаждаться.
Dim sFile : sFile = "C:\testenv\compressed\test.txt"
Dim oShell, oFSO, oEnv, oNet
Set oShell = CreateObject("Wscript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oEnv = oShell.Environment("Process")
Set oNet = WScript.CreateObject("WScript.Network")
Dim sTempFile, aText, i, aInfo
sTempFile = oFSO.GetAbsolutePathName(oFSO.GetTempName)
oShell.Run "%comspec% /c compact " & Chr(34) & sFile & Chr(34) & " > " & Chr(34) & sTempFile & Chr(34), 0, True
aText = Split(oFSO.OpenTextFile(sTempFile,1).ReadAll,vbCrLf)
If oFSO.FileExists(sTempFile) Then oFSO.DeleteFile sTempFile, True
For i = 0 To UBound(aText)
If InStr(aText(i),oFSO.GetBaseName(sFile)) Then
aInfo = Split(Replace(aText(i),"=",":"), ":")
If IsNumeric(Trim(aInfo(1))) Then
WScript.Echo sFile & " : Size on Disk = " & FormatNumber(Trim(aInfo(1)), 0) & " bytes"
End If
End If
Next
Вы можете использовать команду COMPACT.EXE dos для получения размера и размера файла на диске.
Option Explicit
Dim oShell, oFSO, oEnv, oNet
Set oShell = CreateObject("Wscript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oEnv = oShell.Environment("Process")
Set oNet = WScript.CreateObject("WScript.Network")
Dim sFile, sTempFile, aText, i, aInfo
sFile = fBrowseForFile
sTempFile = oFSO.GetAbsolutePathName(oFSO.GetTempName)
oShell.Run "%comspec% /c compact " & Chr(34) & sFile & Chr(34) & " > " & Chr(34) & sTempFile & Chr(34), 0, True
aText = Split(oFSO.OpenTextFile(sTempFile,1).ReadAll,VbCrLf)
If oFSO.FileExists(sTempFile) Then oFSO.DeleteFile sTempFile, True
For i = 0 To UBound(aText)
If InStr(aText(i),oFSO.GetBaseName(sFile)) Then
aInfo = Split(Replace(aText(i),"=",":"), ":")
WScript.Echo sFile & " : Size = " & Trim(aInfo(0))
WScript.Echo sFile & " : Size on Disk = " & Trim(aInfo(1))
End If
Next
Function fBrowseForFile()
Dim sBrowsePath, sBrowseFilter, oBrowseDialog
sBrowsePath = "C:\"
sBrowseFilter = "All Files|*.*"
Set oBrowseDialog = CreateObject("UserAccounts.CommonDialog")
oBrowseDialog.Filter = sBrowseFilter
oBrowseDialog.InitialDir = sBrowsePath
oBrowseDialog.Flags = &H80000 + &H4 + &H8
oBrowseDialog.ShowOpen
fBrowseForFile = oBrowseDialog.FileName
End Function
Я нашел это решение здесь