Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2013, 21:58   #1
stpdqstns
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 33
По умолчанию Определение размера файлов большого размера

Столкнулся с проблемой, раньше определял размер файлов следующим образом:
Код:
ifstream in("file", ios::binary);

in.seekg(0, ios::end);
unsigned long long nFileSize = in.tellg();
in.seekg(0, ios::beg);
и все было нормально, но размер для файла в 5.5гб (5*953*534*652 байт) в nFileSize записывает лишь (1 658 567 356 ). Почему? Как определить размер файла корректно?
stpdqstns вне форума Ответить с цитированием
Старый 12.03.2013, 22:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Если есть возможность использовать WIN API то по-моему пора ей воспользоваться:
GetFileSize() Возвращает размер файла. Если он слишком большой то старшая его часть возвращается в переменку, обьявленную вторым параметром.
Что-то типа
Код:
 unsigned long int k=0;
 int n=GetFileSize(handle,&k);
Примерно так если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.03.2013, 23:20   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

может компилятор не понимает кто такой unsigned long long?
tellg возвращает результат типа streampos, может его юзать, или unsigned __int64.
f.hump вне форума Ответить с цитированием
Старый 13.03.2013, 07:48   #4
stpdqstns
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 33
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
может компилятор не понимает кто такой unsigned long long?
tellg возвращает результат типа streampos, может его юзать, или unsigned __int64.
Дело оказалось не в типе. Помогло :
Код:
unsigned long long nFileSize = in.tellg().seekpos();
Нашел в сети интересный способ для WINAPI:
Код:
unsigned __int64 FileSize(LPCTSTR fileName)
{
    unsigned __int64  size = 0;

    HANDLE file = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(file != INVALID_HANDLE_VALUE)
    {
        LARGE_INTEGER fileSize = {};
        if(GetFileSizeEx(file, &fileSize))
        {
            size = ((static_cast<unsigned __int64>(
                fileSize.u.HighPart) << 32) | fileSize.u.LowPart);
        }
    }
    return size;
}

Последний раз редактировалось stpdqstns; 13.03.2013 в 07:58.
stpdqstns вне форума Ответить с цитированием
Старый 13.03.2013, 11:50   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

если подумать, то с GetFileSizeEx кастить не надо

Код:
...
 if (GetFileSizeEx(file, &fileSize)) size = fileSize.QuadPart;
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать файл большого размера Volkogriz Общие вопросы Delphi 4 21.02.2013 09:43
вывод буквы большого размера masterbet Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 12 30.11.2011 23:57
Delphi 7 и RES файл большого размера acsbaks Общие вопросы Delphi 4 29.11.2011 18:49
Хранение большого размера фото Droid БД в Delphi 0 07.05.2010 01:57
Сохранение книги большого размера. nemoomen Microsoft Office Excel 12 22.03.2009 05:57