Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 01.07.2019
Сообщений: 36

Получение размера файла больше 4гб

25.11.2019, 21:12. Показов 2257. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем, есть у меня образ 7 винды, хочу через винапи функции получить ее размер.

C++
1
2
3
4
5
6
7
8
9
10
11
12
HANDLE hFile;
if (hFile = CreateFileW(filePath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL))
{
            printf("%d\n", GetLastError());
            LARGE_INTEGER size;
            printf("%d\n", GetLastError());
            GetFileSizeEx(hFile, &size);
 
            printf("%d\n", size.QuadPart);
            printf("%d\n", GetLastError());
            getchar();
}
вывод: Название: Screenshot_2.png
Просмотров: 89

Размер: 2.0 Кб

как побороть это?

прочитал, что простой int не может хранить в себе больше 4гб, использую большой инт - но все равно ошибка.
при получении размера маленького файла - ошибок нет, размер файла получается на отлично
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2019, 21:12
Ответы с готовыми решениями:

Получение фактического размера и размера файла в байтах
Здравствуйте, уважаемые форумчане! Мне необходимо получить фактический размер, занимаемый файлом на диске, и размер файла в байтах...

Узнать размер файла больше 4гб
сабж какой функцией можно узнать размер файла больше 4 гб (+ другие св-ва - опционально)? ++ переносимость - не зависит от оси

Получение размера файла
Нижепредставленные два варианта функций действительно справляются с задачей получения размерности файла по заданному пути. Но вот, если...

29
1 / 1 / 0
Регистрация: 01.07.2019
Сообщений: 36
25.11.2019, 21:16  [ТС]
если убрать флаг
C++
1
GENERIC_WRITE
то
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
25.11.2019, 21:39
Цитата Сообщение от veter0 Посмотреть сообщение
хочу через винапи функции получить ее размер
А чем стандартный способ не устроил?
C
1
2
3
4
5
6
  FILE *pf = fopen("lin_test.vdi", "rb"); //lin_test.vdi - просто файл virtualbox'а размером около 8 ГБ
  if(pf == NULL){printf("Err\n"); return 0;}
  fseek(pf, 0, SEEK_END);
  size_t len = ftell(pf);
  fclose(pf);
  printf("%lu\n", len);
Code
1
2
3
$ gcc main.c 
$ ./a.out 
8454668288
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
25.11.2019, 22:59
veter0,
на первом скрине err==5 - "Отказано в доступе."

на втором скрине err==0, ок. Но ты выводишь значение типа LONGLONG QuadPart (это int64_t) , при форматировании нужно указывать %I64d
0
1 / 1 / 0
Регистрация: 01.07.2019
Сообщений: 36
26.11.2019, 05:55  [ТС]
Нужно именно через winapi (createfile)

Доступ к файлу есть, запускаю от имени администратора.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.11.2019, 09:17
---
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
26.11.2019, 12:20
Цитата Сообщение от veter0 Посмотреть сообщение
как побороть это?
покажите что у вас лежит в filePath (она должна быть std::wstring).
в какой кодировке находится проект?
так то всё работает у меня
C++
1
CreateFileW(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
Добавлено через 4 минуты
Цитата Сообщение от veter0 Посмотреть сообщение
запускаю от имени администратора
а всё понятно, не прочитал сразу.
не запускайте от имени админа и всё будет работать.
1
1 / 1 / 0
Регистрация: 01.07.2019
Сообщений: 36
26.11.2019, 13:13  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
не запускайте от имени админа и всё будет работать.
и с, и без не хочет получать размер...

путь к файлу задается через аргументы
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
26.11.2019, 13:18
veter0, в отладчике остановись сразу после строки
GetFileSizeEx(hFile, &size);

в watch глянь значение size.QuadPart
оно там правильное? Если да, то

Цитата Сообщение от Алексей1153 Посмотреть сообщение
при форматировании нужно указывать %I64d
0
1 / 1 / 0
Регистрация: 01.07.2019
Сообщений: 36
26.11.2019, 13:26  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
LONGLONG QuadPart (это int64_t) , при форматировании нужно указывать %I64d
размер вывело

как мне теперь этот размер в какую либо переменную переместить? в long или float
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
26.11.2019, 13:33
veter0, алиллуя!

Цитата Сообщение от veter0 Посмотреть сообщение
какую либо переменную переместить
тип int64_t
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
28.11.2019, 23:34
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А чем стандартный способ не устроил?
Это, кстати, UB и в C и в C++.
0
Заблокирован
29.11.2019, 04:00
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HANDLE hFile;
if (hFile = CreateFileW(filePath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL))
{
            printf("%d\n", GetLastError());
            LARGE_INTEGER size;
            printf("%d\n", GetLastError());
            GetFileSizeEx(hFile, &size);
 
long double dSize = size.QuadPart ;
printf("%.f\n", dSize);
 
            printf("%d\n", size.QuadPart);
            printf("%d\n", GetLastError());
            getchar();
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.11.2019, 10:13
Цитата Сообщение от Croessmah Посмотреть сообщение
Это, кстати, UB и в C и в C++.
почему?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
29.11.2019, 13:56
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
почему?
Так в стандарте написано:
Setting the file position indicator to end-of-file, as with fseek(file, 0, SEEK_END), has undefined behavior for a binary stream (because of possible trailing null characters) or for any stream with state-dependent encoding that does not assuredly end in the initial shift state.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.11.2019, 15:10
А какое дело бинарному файлу до нулевых "хвостов"?
Если посмотреть контекст этой сноски, больше похоже, что речь о многобайтных символах:
Although both text and binary wide-oriented streams are conceptually sequences of wide characters, the external file associated with a wide-oriented stream is a sequence of multibyte characters, generalized as follows
- Multibyte encodings within files may contain embedded null bytes (unlike multibyte encodings valid for use internal to the program).
- A file need not begin nor end in the initial shift state
Соответственно, вся неопределенность в возможном неправильном подсчете символов. Но нас-то не символы интересуют, а байты.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
29.11.2019, 15:28
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А какое дело бинарному файлу до нулевых "хвостов"?
https://stackoverflow.com/ques... -behaviour
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.11.2019, 16:09
И? Пока противоречия не вижу.
Ну да, при чтении каких-то конкретных данных вроде текста (иногда при чтении одного байта '\n' может быть выдано два '\n'+'\r', те же многобайтные или записи) из файла считывается больше данных, чем там есть.
Но нас-то интересует размер файла - сколько сырых байт в нем содержится.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
29.11.2019, 16:26
COKPOWEHEU, причем здесь \n\r? По ссылке ответ прочитайте.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.11.2019, 17:02
Croessmah, пожалуйста, давайте обойдемся без намеков. Я прочитал вопрос и ответы по вашей ссылке и не увидел противоречия. Не спорю, это может быть связано с плохим знанием языка. Но из того, что я понял, рассматривались текстовые файлы, файлы из блоков фиксированного размера и прочая экзотика, не имеющая прямого отношения к исходному вопросу в этой теме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2019, 17:02
Помогаю со студенческими работами здесь

Получение размера файла FTP
Взял код из FAQ по получению размера файла на FTP - сервере: Dim Request As Net.FtpWebRequest =...

Получение размера файла с кирилическими символами
Есть код: std::fstream fp2(Memo9->Lines->Strings.w_str() , std::fstream::in); fp2.seekp(0, std::ios::end); int size2 =...

Ошибка при получение размера файла с сайта
QNetworkRequest request;; request.setUrl(QUrl("http://finder-rp.ru/custom.zip")); QNetworkAccessManager* pManager= new...

Получение размера файла с помощью fstream. ОТВЕТ.
Для того, кто не знает как получить размер файла, и того, кто не хочет пользоваться API или не умеет: ВОТ ПОЛУЧЕНИЕ РАЗМЕРА: fstream...

Настройка Dev-C++ на получение исполняемого файла минимального размера
Доброго времени суток! Подскажите настройки компилятора IDE Dev-C++ (v 4.9.9.2). Элементарно, Hello world! у меня больше 450 кб...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru