Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как загнать в __int64 размер файла посредством GetFileSizeEx?

3.3K
31 декабря 2004 года
DENIS451
38 / / 31.12.2004
Как в C++ Builder, 6 используя функцию GetFileSizeEx, загнать размер
файла в переменную типа __int64?
487
31 декабря 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by DENIS451
Как в C++ Builder, 6 используя функцию GetFileSizeEx, загнать размер
файла в переменную типа __int64?



Например так:

 
Код:
__int64 val;
LARGE_INTEGER fsize;

GetFileSizeEx(hFile,&fsize);
val=fsize.QuadPart;
3.3K
01 января 2005 года
DENIS451
38 / / 31.12.2004
Цитата:
Originally posted by ddnh_bc


Например так:
 
Код:
__int64 val;
LARGE_INTEGER fsize;

GetFileSizeEx(hFile,&fsize);
val=fsize.QuadPart;




Что я не так делаю?

Код:
char vr_buff[100];
__int64 fff = 0;
FILE* hFile;
LARGE_INTEGER fsize;
int bute_1=0;
int bute_2=0;
hFile = fopen("H:\\2.rar","rb");
GetFileSizeEx(hFile,&fsize);
fff=fsize.QuadPart;
bute_1 = fff / 1000000000;
bute_2 = fff - 1000000000*bute_1;
sprintf(vr_buff,"%d%d",bute_1,bute_2);
Memo1->Lines->Add(vr_buff);

получается всегда 12886081551 на любом файле.
301
01 января 2005 года
lord Kelvin
897 / / 08.11.2004
По-моему у GetFileSizeEx первый параметр - то, что возвращает open.
 
Код:
#include <fcntl.h>
#include <sys\stat.h>
int open(const char *path, int access [ , unsigned mode ] );
3.3K
01 января 2005 года
DENIS451
38 / / 31.12.2004
Я так и сделал, но ведь размер не правильно
получается!
Я жду пока ddnh_bc ответит он должен знать,
т.к. назвался профессионалом.
301
01 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by DENIS451
Я так и сделал, но ведь размер не правильно
получается!
Я жду пока ddnh_bc ответит он должен знать,
т.к. назвался профессионалом.


А я флудер.=)

 
Код:
HANDLE file=CreateFile("G:\\Films\\Ali G Indahouse\\Ali G Indahouse.avi",
GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
 __int64 fls;
 DWORD hgs,lws;
 lws=GetFileSize(file,&hgs);
 CloseHandle(file);
 fls=hgs;
 fls<<=32;
 fls+=lws;
 Memo1->Lines->Add(IntToStr(fls));

В данный момент я создаю файл 5 гигов весом, чтобы проверить работу этого кода. (так как DWORD 32 бита - может хранить размер до 4 гигабайт)
301
01 января 2005 года
lord Kelvin
897 / / 08.11.2004
Все работает. Чудесно, да? Мне теперь 5 гиговый TXT'шник не нужен. Тебе не скинуть на мыло?=)
3.3K
01 января 2005 года
DENIS451
38 / / 31.12.2004
32 бита не достаточно. Мне 64 надо. Файлы надо
обрабатывать больше чем 4 Гб.
3.3K
01 января 2005 года
DENIS451
38 / / 31.12.2004
Всё разобрался! Огромное спасибо lord Kelvin-у
и ddnh_bc-у.
Теперь у меня появились новые вопросы.
Разве GetFileSizeEx это всё не просще сделать?
Функция CreateFile с такими парамертрами:

HANDLE file=CreateFile("G:\\Films\\AliIndahouse\\Ali G Indahouse.avi",
GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NO
RMAL,0);

не будет мешать ISA серверу дописывать строки в
лог файл который я читаю?
Есщё я не могу с ReadFile разобраться, тока для
ReadFile я отдельную тему создам.
301
01 января 2005 года
lord Kelvin
897 / / 08.11.2004
Раз ты работаешь в Boralnd'е то пользуйся TFileStream
 
Код:
byte buf[256];
TFileStream *stream = new TFileStream("c:\\file.cpp",fmOpenRead | fmShareDenyNone);
stream->Size; // Размер файла.
stream->Read(buf,256);
/*...*/
delete stream;

Так другие программы тоже смогут работать с файлом даже тогда, когда ты его читаешь.
3.3K
01 января 2005 года
DENIS451
38 / / 31.12.2004
Мне надо читать файл с произвольного места
а не тока сначала. Лучше обьясни как работать
с ReadFile.
301
01 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by DENIS451
Мне надо читать файл с произвольного места
а не тока сначала. Лучше обьясни как работать
с ReadFile.


Неугомонный.=)

 
Код:
stream->Position;

Вот тебе и смена позиции. А чем тебе ReadFile приглянулся?
3.3K
01 января 2005 года
DENIS451
38 / / 31.12.2004
Моя прога первой версии брала по одному байту
из файла, но работала очень медленно. Потом я
стал читать сразу по мегабайту в память

fread(kusok,dlinna_kuska,1,log);

и скорость обработки файла вырасла в 40 раз,
хотя прога значительно усложнилась.
Вот я опасаюсь а не станет ли

stream->Read(buf,1000000);

работать медленние fread?
301
02 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by DENIS451
Моя прога первой версии брала по одному байту
из файла, но работала очень медленно. Потом я
стал читать сразу по мегабайту в память

fread(kusok,dlinna_kuska,1,log);

и скорость обработки файла вырасла в 40 раз,
хотя прога значительно усложнилась.
Вот я опасаюсь а не станет ли

stream->Read(buf,1000000);

работать медленние fread?


1000000 - не 1 мегабайт (1 Мб - 2^20 = 1048576.Но это ты и без меня знаешь.=) )
А ты проверь. Пусть в цикле сначала fread прочитает много-много раз, а потом stream->Read столько же. А ты сравнишь время. И решишь, что лучше. Вот. А файл для чтения в аттаче. При распаковке он займет ровно 2 гигабайта. Я не шучу.

3.3K
03 января 2005 года
DENIS451
38 / / 31.12.2004
Спасибо, но я и так файл большой могу сделать-
фильмов в рар архив без сжатия засунуть.
Я ща в исходниках меняю код на тот что с
потоком. Потом напишу что выйдет.
301
03 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by DENIS451
Спасибо, но я и так файл большой могу сделать-
фильмов в рар архив без сжатия засунуть.
Я ща в исходниках меняю код на тот что с
потоком. Потом напишу что выйдет.


Ну что ж, рад. Успехов!
(Да простят мне флуд.)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог