Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
uzlprog
14 / 14 / 3
Регистрация: 23.04.2012
Сообщений: 541
#1

Как подсчитать размер файла в байтах, килобайтах, мегабайтах и т.п - Visual Basic .NET

18.05.2013, 16:21. Просмотров 2185. Ответов 18
Метки нет (Все метки)

Итак, в форме программы должен выводится размер файла в зависимости от которого, показатель будет измеряться в b, Kb, Mb, Gb. Возникли некоторые сложности в подсчете, ведь функция IO.FileInfo.Length выводит размер в байтах.

Возникла мысль сделать через If:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
           If FI.Length < 1024 Then
                LabelMb.Text = Math.Round(FI.Length, 1) & " b"
            End If
            If 1073741824 > FI.Length > 1024 Then
                LabelMb.Text = Math.Round((FI.Length / 1024), 1) & " Kb"
            End If
            If 1099511627776 > FI.Length > 1073741824 Then
                LabelMb.Text = Math.Round((FI.Length / 1073741824), 2) & " Mb"
            End If
            If FI.Length > 1099511627776 Then
                LabelMb.Text = Math.Round((FI.Length / (1.1 * 10 ^ 12)), 2) & " Gb"
            End If
Но не покатило(
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 16:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как подсчитать размер файла в байтах, килобайтах, мегабайтах и т.п (Visual Basic .NET):

Как узнать размер в байтах графических объектов
Здравствуйте. Как программно узнать размер в байтах графических объектов -...

Определить размер папки на компьютере в байтах
Как можно проще всего програмно, например при нажатии на кноку определить...

Как узнать размер файла
Как узнать размер файла в GB и MB? Добавлено через 2 часа 15 минут Понятно,...

Измерьте объем следующего информационного сообщения в битах, байтах, килобайтах и мегабайтах
1 )Измерьте объем следующего информационного сообщения в битах, байтах,...

Вводится с клавиатуры размер файла байтах,определить и вывести на экран значение в килобайтах?
Вводится с клавиатуры размер файла байтах,определить и вывести на экран...

Вычислить суммарный размер файлов в килобайтах и средний размер файла
Нужно составить программу с помощью которой с клавиатуры вводятся размер 6...

18
Release
Заблокирован
18.05.2013, 17:18 #2
А так не катит?
vb.net
1
2
3
Dim FI As New IO.FileInfo("Путь к файлу")
MsgBox(Math.Round(FI.Length / 1024) & " Кб")
MsgBox(Math.Round(FI.Length / 1048576) & " Мб")
0
uzlprog
14 / 14 / 3
Регистрация: 23.04.2012
Сообщений: 541
18.05.2013, 18:15  [ТС] #3
Вся фишка в том, что поле для вывода размера одно и в нем должны показываться Кб или Мб, в зависимости от объема файла.
Пример: если n Кб больше 1024 То выводим значение в Мб.
0
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
18.05.2013, 21:35 #4
vb.net
1
2
3
4
5
If (Size / 1024) < 1024 Then 'Размер в килобайтах
            LabelSizeTotal.Text = Math.Round((Size / 1024), 3) & " Kb"
        Else                                                          'Размер в мегабайтах
            LabelSizeTotal.Text = Math.Round((Size / 1048576), 3) & " Mb"
        End If
Size объявите уже сами)
0
edward_freedom
1553 / 1432 / 302
Регистрация: 01.10.2011
Сообщений: 2,636
18.05.2013, 22:32 #5
uzlprog, Клик
0
uzlprog
14 / 14 / 3
Регистрация: 23.04.2012
Сообщений: 541
18.05.2013, 23:04  [ТС] #6
Цитата Сообщение от Gelo123321 Посмотреть сообщение
vb.net
1
2
3
4
5
If (Size / 1024) < 1024 Then 'Размер в килобайтах
            LabelSizeTotal.Text = Math.Round((Size / 1024), 3) & " Kb"
        Else                                                          'Размер в мегабайтах
            LabelSizeTotal.Text = Math.Round((Size / 1048576), 3) & " Mb"
        End If
Size объявите уже сами)
Что удивительно, выполняется только последнее условие. Считает в Mb, выход нашелся:

vb.net
1
2
3
4
5
If (Size / 1024) < 1024 Then 'Размер в килобайтах
            LabelSizeTotal.Text = Math.Round((Size / 1024), 3) & " Kb"
        Else                                                          'Размер в мегабайтах
            LabelSizeTotal.Text = Math.Round((Size / 1024 / 1024), 3) & " Mb"
        End If
Хз, почему так??
0
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
20.05.2013, 20:09 #7
uzlprog, без понятия, у меня все хорошо считало, если меньше мегабайта - отображало в килобайтах, если больше - в мегабайтах. Кучу раз проверял, в свое время...
0
mus-lk
0 / 0 / 1
Регистрация: 22.03.2015
Сообщений: 3
10.04.2016, 23:01 #8
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

В свое время писал такую функцию, мож кому понадобится.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Function GetFileSize(ByVal SizeInByte As Long) As String
 
        If (SizeInByte) < 1024 Then
            GetFileSize = SizeInByte & " Б"
        ElseIf (SizeInByte) < 1024 ^ 2 Then
            GetFileSize = Format(SizeInByte / 1024 ^ 1, "0.00") & " КБ"
        ElseIf (SizeInByte) < 1024 ^ 3 Then
            GetFileSize = Format(SizeInByte / 1024 ^ 2, "0.00") & " МБ"
        ElseIf (SizeInByte) < 1024 ^ 4 Then
            GetFileSize = Format(SizeInByte / 1024 ^ 3, "0.00") & " ГБ"
        ElseIf (SizeInByte) < 1024 ^ 5 Then
            GetFileSize = Format(SizeInByte / 1024 ^ 4, "0.00") & " ТБ"
        End If
 
    End Function
0
vova2112
113 / 105 / 30
Регистрация: 28.02.2014
Сообщений: 125
11.04.2016, 10:35 #9
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function LengthFile(ByVal length As Long) As String
        Dim Result As String = "0 Байт"
        Const KB As Integer = 1024, MB As Integer = 1048576, GB As Integer = 1073741824
        Const TB As Long = 1099511627776 ', PB As Long = 1125899906842624, EB As Long = 1152921504606846976
        Select Case length
            Case 0 To KB
                Result = If(length <= KB - 1, length & " Байт", "1 КБ")
            Case KB To MB
                Result = If((length / KB) <= MB - 1, Int((length / KB) * 10) / 10 & " КБ", "1 МБ")
            Case MB To GB
                Result = If((length / MB) <= GB - 1, Int((length / MB) * 10) / 10 & " МБ", "1 ГБ")
            Case GB To TB
                Result = If((length / GB) <= TB - 1, Int((length / GB) * 10) / 10 & " ГБ", "1 Тб")
        End Select
        Return Result
    End Function
2
timsc1
9 / 9 / 2
Регистрация: 27.11.2011
Сообщений: 605
05.09.2016, 20:06 #10
mus-lk, vova2112, подскажите пож-ста, как использовать ваши функции, у меня адрес файла в переменной s. Спасибо!!!
0
Yury Komar
Модератор
Эксперт .NET
2364 / 2169 / 346
Регистрация: 27.01.2014
Сообщений: 3,898
Завершенные тесты: 1
05.09.2016, 20:26 #11
timsc1, я думаю так

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim FI As New IO.FileInfo("Путь к файлу")
Msgbox(GetFileSize(FI.Length))
 
Public Function GetFileSize(ByVal FileSizeInBytes As Integer) As String
        Dim Result As String = "0 Байт"
        Const KB As Integer = 1024, MB As Integer = 1048576, GB As Integer = 1073741824
        Const TB As Long = 1099511627776 ', PB As Long = 1125899906842624, EB As Long = 1152921504606846976
        Select Case length
            Case 0 To KB
                Result = If(FileSizeInBytes <= KB - 1, FileSizeInBytes & " Байт", "1 КБ")
            Case KB To MB
                Result = If((FileSizeInBytes / KB) <= MB - 1, Int((FileSizeInBytes / KB) * 10) / 10 & " КБ", "1 МБ")
            Case MB To GB
                Result = If((FileSizeInBytes / MB) <= GB - 1, Int((FileSizeInBytes / MB) * 10) / 10 & " МБ", "1 ГБ")
            Case GB To TB
                Result = If((FileSizeInBytes / GB) <= TB - 1, Int((FileSizeInBytes / GB) * 10) / 10 & " ГБ", "1 Тб")
        End Select
        Return Result
    End Function
2
timsc1
9 / 9 / 2
Регистрация: 27.11.2011
Сообщений: 605
05.09.2016, 21:24 #12
Yury Komar,
0
Orlangur1991
1021 / 955 / 225
Регистрация: 28.11.2014
Сообщений: 1,457
07.09.2016, 10:49 #13
Использовать в условии And типа
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Dim FI As New IO.FileInfo(path_to_file)
            'Определяем размер файла
            If FI.Length <= 1000 Then
                Label1.Text = FI.Length & " Байт"
            End If
            If FI.Length > 1000 And FI.Length < 1000000 Then
                Label1.Text = Math.Round(FI.Length / 1024, 2, MidpointRounding.AwayFromZero) & " Кб"
            End If
            If FI.Length >= 1000000 And FI.Length < 1000000000 Then
                Label1.Text = Math.Round(FI.Length / 1024 / 1024, 2, MidpointRounding.AwayFromZero) & " Мб"
            End If
            If FI.Length >= 1000000000 And FI.Length < 1000000000000 Then
                Label1.Text = Math.Round(FI.Length / 1024 / 1024 / 1024, 2, MidpointRounding.AwayFromZero) & " Гб"
            End If
0
Petr_S
196 / 197 / 87
Регистрация: 21.04.2013
Сообщений: 381
08.09.2016, 02:17 #14
А если логарифм?
vb.net
1
2
3
4
5
6
    Private Function GetFileLength(ByVal FileSizeInBytes As Long) As String
        Dim unit() As String = {"B", "KB", "MB", "GB", "TB"}
        Dim p As Integer = Math.Min(CInt(Math.Truncate(Math.Log(CDbl(FileSizeInBytes), 1024))), unit.Length - 1)
 
        Return String.Format("{0}{1}", CInt(FileSizeInBytes / Math.Pow(1024, p)), unit(p))
    End Function
3
Rius
Эксперт .NET
4552 / 2866 / 702
Регистрация: 25.05.2015
Сообщений: 8,845
Записей в блоге: 10
Завершенные тесты: 4
08.09.2016, 06:04 #15
А если Linq?
vb.net
1
2
3
4
5
Private Shared Function FormatSize(size As Long) As String
    Dim formats As String() = { "{0} Б", "{0:0.00} КиБ", "{0:0.00} МиБ", "{0:0.00} ГиБ", "{0:0.00} ТиБ", "{0:0.00} ПиБ", "{0:0.00} ЭиБ" }
    Dim a = formats.[Select](Function(x, i) New With { Key .Format = x, Key .Power = CLng(Math.Pow(2, 10 * i)) }).TakeWhile(Function(x) x.Power < size).Last()
    Return [String].Format(a.Format, size / a.Power)
End Function
5
Petr_S
196 / 197 / 87
Регистрация: 21.04.2013
Сообщений: 381
08.09.2016, 16:00 #16
Rius, интересно конечно, но не будет ли лишних расчетов?
А именно - расчет значений для всех CLng(Math.Pow(2, 10 * i) с последующей выборкой того, что меньше size, с последующим же выбором последнего значения Last.

Небольшие изменения:
vb.net
1
2
3
4
5
6
7
    Function GetFileLength(ByVal FileSizeInBytes As Long) As String
        Dim unit() As String = {"", "K", "M", "G", "T", "P", "E"}
        Dim p As Integer = Math.Min(CInt(Math.Truncate(Math.Log(FileSizeInBytes, 1024))), unit.Length - 1)
        Return String.Format("{0}{1}", _
                             Math.Round(FileSizeInBytes / Math.Pow(1024, p), 2, MidpointRounding.AwayFromZero), _
                             unit(p) & "B")
    End Function
0
Rius
Эксперт .NET
4552 / 2866 / 702
Регистрация: 25.05.2015
Сообщений: 8,845
Записей в блоге: 10
Завершенные тесты: 4
08.09.2016, 16:17 #17
Именно расчётов степени - только +1 элемент после искомой, потому что TakeWhile().
Вот если бы просто Last() с условием, тогда бы весь ряд рассчитывался.
0
Petr_S
196 / 197 / 87
Регистрация: 21.04.2013
Сообщений: 381
08.09.2016, 18:38 #18
Rius, погонял Ваш вариант еще:
1) При вызове функции со значениями аргумента 0 или 1. Процедура вываливается с руганью "Последовательность не содержит элементов".
2) Решил посмотреть, что за последовательность, из которой берется Last, получается. Конкретно ее длина.
- по килобайт: 1 (одно вычисление);
- от 1025 по мегабайт: 2 (два вычисления);
- от (1024*1024 + 1) по гигабайт: 3 (три вычисления);
и т.д.
Т.е. чем больше значение аргумента функции, тем больше вычислений происходит. Для тера это, например, 5 вычислений. Хотя, не могу не исключить, что считаются также значения и для пета и для экса. Просто они не берутся в последовательность.

Апдейт моей процедуры:
vb.net
1
2
3
4
5
6
7
8
9
    Function GetFileLength(ByVal FileSizeInBytes As Long) As String
        Dim unit() As String = {"", "K", "M", "G", "T", "P", "E"}
        Dim p As Integer = If(FileSizeInBytes > 0, _
                              Math.Min(CInt(Math.Truncate(Math.Log(FileSizeInBytes, 1024))), unit.Length - 1), _
                              0)
        Return String.Format("{0}{1}B", _
                             Math.Round(FileSizeInBytes / Math.Pow(1024, p), 2, MidpointRounding.AwayFromZero), _
                             unit(p))
    End Function
0
Rius
Эксперт .NET
4552 / 2866 / 702
Регистрация: 25.05.2015
Сообщений: 8,845
Записей в блоге: 10
Завершенные тесты: 4
08.09.2016, 18:51 #19
Цитата Сообщение от Petr_S Посмотреть сообщение
Т.е. чем больше значение аргумента функции, тем больше вычислений происходит.
Верно.
Об оптимизации всё равно надо думать только по результатам.
И красиво написанный метод наверняка будет тормознее быстрого метода.
0
08.09.2016, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2016, 18:51
Привет! Вот еще темы с решениями:

GD как узнать размер файла, в байтах, на выходе?
Всем привет! Простенький пример: Делаем привьюшку. $src = 'file.jpg'; ...

Подсчитать размер файлов F1 и F2 (в байтах)
Постановка задачи: Создать текстовый файл F1 не менее, чем из 10 строк и...

Известен объем информации в байтах.Выразить его в мегабайтах и гигабайтах
Рабочее окно приложения должно содержать условие задачи, а ввод - вывод...

пишу плеер(фонон) хочу чтобы выводил размер воспроизв. файла(в мегабайтах или др)
void MainWindow::openFile() { QFileDialog dialog(this); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru