[total noob]Как определить занимаемый файлом объем диска?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

[total noob]Как определить занимаемый файлом объем диска?

Сообщение _ae_ » 06.11.2006 (Пн) 14:42

IO.FileInfo.Length возвращает объем содержимого файла. А как узнать, сколько этот файл занимает на диске?
(простите за нубский вопрос, искал, но не нашел)
.NET 2.0

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.11.2006 (Пн) 14:51

Очевидно, узнать размер сектора диска, поделить размер файла на размер сектора и округлить в большую сторону?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 06.11.2006 (Пн) 14:56

А если файл сжат?

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 06.11.2006 (Пн) 18:54

В FW тоже ничего не нашел. Можно попробовать такой небольшой модуль
Код: Выделить всё
Public Module FileSizeHelper
    <DllImport("kernel32.dll")> _
    Private Function GetCompressedFileSizeW(<MarshalAs(UnmanagedType.LPWStr)> ByVal filename As String, ByRef sz As UInteger) As UInteger
    End Function

    Private Function GetFileSize(ByVal fileName As String) As Long
        Dim i1 As UInteger
        Dim i2 As UInteger = 0
        i1 = GetCompressedFileSizeW(fileName, i2)
        Return ((CLng(i2)) << 32) Or (CLng(i1))
    End Function

    Public Function GetFileRealSpace(ByVal fileName As String) As Long
        Dim fi As New FileInfo(fileName)
        Dim result As Long
        If fi.Attributes And FileAttributes.Compressed = FileAttributes.Compressed Then
            result = GetFileSize(fileName)
        Else
            result = fi.Length
        End If
        Return result
    End Function
End Module

Как показала проверка, GetCompressedFileSizeW() для сжатого файла выдает размер уже округленный до размера кластера, а для несжатого - то же самое, что и FileInfo.Length, т.е. для несжатого нужно округлять до размера кластера вручную. Более подробно - см. MSDN по GetCompressedFileSize().


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 105

    TopList