Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732

Ф-ция определения размера файла

24.11.2011, 16:38. Показов 2994. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
написал бредовенькую ф-цию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void __fastcall Taddfiles::GetFileSizeFunc(UnicodeString path, int xz) {
 
    GetFileAttributesEx(path.w_str(), GetFileExInfoStandard, &fData);
    nFileLen = (fData.nFileSizeHigh * (MAXDWORD + 1)) + fData.nFileSizeLow;
 
    if (nFileLen / 1024 < 1024) {
        StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen, ffFixed, 7, 2)
            + " KB";
    }
    else if (nFileLen / 1024 / 1024 < 1024) {
        StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen / 1024 / 1024, ffFixed,
            7, 2) + " MB";
 
    }
    else if (nFileLen / 1024 / 1024 / 1024 < 1024) {
        StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen / 1024 / 1024 / 1024,
            ffFixed, 7, 2) + " GB";
    }
    else if (nFileLen / 1024 / 1024 / 1024 / 1024 < 1024) {
        StringGrid1->Cells[1][xz] =
            FloatToStrF(nFileLen / 1024 / 1024 / 1024 / 1024, ffFixed, 7, 2)
            + " TB";
    }
 
}
как думаете, это нормально или слегка бредово и можно упростить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2011, 16:38
Ответы с готовыми решениями:

Задача определения размера файла (пример решения)
Задача определения размера файла на C++. Для определения размера файла, в данном случае, самого себя. Нужно узнать путь к себе. Затем...

стандартная ф-ция определения абсолютной величины числа
Даны два вещественных числа. Условно принимая, что соответствующей стандартной функции определения абсолютной величины числа нет, найти: ...

Функция определения размера проекции файла
Для определения физического размера файла на диске есть функция GetFileSize(pFile, 0); А есть функция, которая позволяет определить...

12
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
24.11.2011, 16:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void __fastcall Taddfiles::GetFileSizeFunc(UnicodeString path, int xz)
{
int basic = 1024
int mb = pow(basic,2); 
int gb = pow(basic,3); 
int tb = pow(basic,4); 
//
        GetFileAttributesEx(path.w_str(), GetFileExInfoStandard, &fData);
        nFileLen = (fData.nFileSizeHigh * (MAXDWORD + 1)) + fData.nFileSizeLow;
 
        if (nFileLen / basic < basic) {
                StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen, ffFixed, 7, 2)
                        + " KB";
        }
        else if (nFileLen / mb < basic) {
                StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen / mb, ffFixed,
                        7, 2) + " MB";
 
        }
        else if (nFileLen / gb < basic) {
                StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen / gb,
                        ffFixed, 7, 2) + " GB";
        }
        else if (nFileLen / tb < basic) {
                StringGrid1->Cells[1][xz] =
                        FloatToStrF(nFileLen / tb, ffFixed, 7, 2)
                        + " TB";
        }
 
}
2
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
24.11.2011, 19:14  [ТС]
А не мал ли инт под гб и тб?
Но все таки наверно стоит ручками посчитать и записать кб, мб, гб, тб в переменные чтобы каждый раз не считало
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
24.11.2011, 19:30
INT_MAX == 2147483647
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
25.11.2011, 03:29  [ТС]
А 1024 ^ 4 = 1099511627776 что > 2147483647
Чет я провтыкал, ток тб забольшой, гб норм

Добавлено через 7 часов 45 минут
Хотя и фиг с ним, с тем тб. Терабайтных файлов все равно нету
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
25.11.2011, 04:21
include\windows\crtl\_lim.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*  _lim.h - Internal version of "C" limits.h header
    Defines implementation specific limits on type values.
*/
/*
 *  C/C++ Run Time Library - Version 16.0b
 *
 *  Copyright (c) 1987, 2010 by Embarcadero Technologies, Inc.
 *   All Rights Reserved.
 *
 */
 
#ifndef __LIMITS_H
#define __LIMITS_H
#define _INC_LIMITS  /* MSC Guard name */
 
#include <_stddef.h>
 
#define CHAR_BIT        8               /* number of bits in a char */
#define MB_LEN_MAX      2               /* max. # bytes in multibyte char */
 
#define SCHAR_MIN     (-128)            /* minimum signed   char value */
#define SCHAR_MAX       127             /* maximum signed   char value */
#define UCHAR_MAX       255             /* maximum unsigned char value */
 
#if ('\x80' < 0)
#define CHAR_MIN        SCHAR_MIN       /* minimum char value */
#define CHAR_MAX        SCHAR_MAX       /* maximum char value */
#else
#define CHAR_MIN        0
#define CHAR_MAX        UCHAR_MAX
#endif
 
#define SHRT_MIN      (-32767-1)        /* minimum signed   short value */
#define SHRT_MAX        32767           /* maximum signed   short value */
#define USHRT_MAX       65535U          /* maximum unsigned short value */
 
#if !defined(__INT_MIN_MAX_DEFINED)
#define __INT_MIN_MAX_DEFINED
#define LONG_MIN      (-2147483647L-1)  /* minimum signed   long value */
#define LONG_MAX        2147483647L     /* maximum signed   long value */
#define ULONG_MAX       4294967295UL    /* maximum unsigned long value */
#define INT_MIN         LONG_MIN        /* minimum signed   int value */
#define INT_MAX         LONG_MAX        /* maximum signed   int value */
#define UINT_MAX        ULONG_MAX       /* maximum unsigned int value */
#endif
 
#if defined (_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS >= 64)
#define _I64_MIN      (-9223372036854775807i64-1) /* minimum signed   __int64 value */
#define _I64_MAX        9223372036854775807i64    /* maximum signed   __int64 value */
#define _UI64_MAX       18446744073709551615ui64  /* maximum unsigned __int64 value */
#define LLONG_MIN       _I64_MIN
#define LLONG_MAX       _I64_MAX
#define ULLONG_MAX      _UI64_MAX
#endif
 
#if defined(_POSIX_)
 
#define _POSIX_ARG_MAX          4096
#define _POSIX_CHILD_MAX        6
#define _POSIX_LINK_MAX         8
#define _POSIX_MAX_CANON        255
#define _POSIX_MAX_INPUT        255
#define _POSIX_NAME_MAX         14
#define _POSIX_NGROUPS_MAX      0
#define _POSIX_OPEN_MAX         16
#define _POSIX_PATH_MAX         255
#define _POSIX_PIPE_BUF         512
#define _POSIX_SSIZE_MAX        32767
#define _POSIX_STREAM_MAX       8
#define _POSIX_TZNAME_MAX       3
 
#define ARG_MAX                 (16384 - 256)   /* 16k-(heap overhead+safety) */
#define CHILD_MAX               32
#define LINK_MAX                _POSIX_LINK_MAX
#define MAX_CANON               _POSIX_MAX_CANON
#define MAX_INPUT               _POSIX_MAX_INPUT
#define NAME_MAX                255
#define NGROUPS_MAX             16
#define OPEN_MAX                32
#define PATH_MAX                512
#define PIPE_BUF                _POSIX_PIPE_BUF
#define SSIZE_MAX               _POSIX_SSIZE_MAX
#define STREAM_MAX              20
#define TZNAME_MAX              10
 
#endif /* POSIX */
#endif  /* __LIMITS_H */
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.11.2011, 12:30
А вот так не короче будет?
C++
1
2
3
4
5
6
7
      AnsiString dob[4]={" á"," ÊÁ"," ÌÁ"," ÃÁ"};
      TVarRec args[3] = {3,2,12.34};
 
      float fo = nFileLen; int  ind=0;
      while (fo>1023) { fo=fo/1024; ind++; }
      args[2]=fo;
      StringGrid1->Cells[1][xz] = Format("%*.*f", args, 2)+dob[ind];


Добавлено через 1 час 8 минут
... или даже так (чтоб с байтами аккуратней было):
C++
1
2
3
4
      AnsiString dob[4]={" á"," ÊÁ"," ÌÁ"," ÃÁ"};
      float fo = nFileLen; int ind = 0, zn = 0 ;
      while (fo>1023) { fo=fo/1024; ind++; zn=2; }
      StringGrid1->Cells[1][xz] = FloatToStrF(fo,ffFixed,4,zn)+dob[ind];
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.11.2011, 12:38
nick42, ты меня опередил Но все же привожу свой вариант на чистом Си
C
1
2
3
4
char *dob[4]={" б"," КБ"," МБ"," ГБ"};
long fo = filelength(fileno(f));
for(i=0; fo>1024 && i<4; i++) fo /= 1024;
printf("%ld %s", fo, dob[i]);
1
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
25.11.2011, 16:13  [ТС]
какой будет быстрее всех, то есть какой вариант самый оптимальный. файлов может быть мало, а может быть и много.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   
int mb=1048576; gb=1073741824;
void __fastcall Taddfiles::GetFileSizeFunc(UnicodeString path, int xz) {
 
        GetFileAttributesEx(path.w_str(), GetFileExInfoStandard, &fData);
        nFileLen = (fData.nFileSizeHigh * (MAXDWORD + 1)) + fData.nFileSizeLow;
 
        if (nFileLen / 1024 < 1024) {
                StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen, ffFixed, 7, 2)
                        + " KB";
        }
        else if (nFileLen / mb < 1024) {
                StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen / mb, ffFixed,
                        7, 2) + " MB";
 
        }
        else if (nFileLen / gb < 1024) {
                StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen / gb,
                        ffFixed, 7, 2) + " GB";
        }
 
}
или
C++
1
2
3
4
AnsiString dob[3]={" KB"," MB"," GB"};
 int ind = 0;
      while (nFileLen>1023) { nFileLen=nFileLen/1024; ind++;  }
      StringGrid1->Cells[1][xz] = FloatToStrF(nFileLen,ffFixed,7,2)+dob[ind];
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.11.2011, 16:43
Ну, если компьютер собран на процессоре Intel 8080, то ... . Кстати, Вы мой вариант упростили неправильно, мне кажется.
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
25.11.2011, 17:41  [ТС]
а, да. есть такое
надо было либо оставить с байтами либо
C++
1
while (nFileLen>1048575)
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
06.01.2012, 16:33  [ТС]
вот попробовал с файлом в 28гб (30*154*258*186б ) но получилось что-то не то. Может не поместилось значение? Какие предположения?

Добавлено через 17 часов 39 минут
Нашел решение
C++
1
2
3
4
5
unsigned __int64 nFileLen;
 
//------------------------------------------------
 
nFileLen = (fData.nFileSizeHigh * ((unsigned __int64)MAXDWORD + 1)) + fData.nFileSizeLow;
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.01.2012, 00:51
Flyer, (MAXDWORD + 1) = 0 (тождественно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2012, 00:51
Помогаю со студенческими работами здесь

Есть ли в php функция определения размера удалленного файла?
Есть ли в php функция определения размера удалленного файла, т.е. при указании ссылки на фаил показывается его размер, причет ссылка вида...

Написать функцию определения размера стека
необходима функция определения размера стека. Как это реализовать? мой стек и моя попытка выделить мах размер стеку: typedef struct...

Странность определения размера памяти структуры
Здравствуйте. Никогда с таким не сталкивался, а сейчас просто крышу снесло пока нашёл ошибку там, где не ожидал... struct STRUCT{INT32...

Отображение размера файла в kB, MB или GB в зависимости от величины его размера в байтах
добрый вечер! У меня есть значение размера файлов в байтах. Подскажите, как отобразить размера файлов в KB MB GB? Интересует два...

Исправить скрипт для определения размера вклада
ЧТО В НЕЙ НЕ ТАК? (Банковская программа. Пользователь вводит сумму вклада и процент, который будет начисляться ежегодно. Отобразить размер...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru