Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер файла, оптимально быстро определить размер файл 
:(
    Опции темы
Bima
Дата 25.12.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



есть код:
Код

void SizeFile(void)           //   Подпрограмма определения размеров файлов 
{
int handle;
for (int i=1; i<11; i++)
   {
   if(MyEnable[i])
      {
      if (FileExists(MyFile[i]))
         {
         handle = open(MyFile[i].c_str(), O_RDONLY);
         OldSize[i]=filelength(handle);
         close(handle);
         }
      else
         OldSize[i]=(-1);
      }
   else
      OldSize[i]=(-1);
   }
}


Здесь интересны всего три строки:
Код

handle = open(MyFile[i].c_str(), O_RDONLY);
OldSize[i]=filelength(handle);
close(handle);


что бы их добавить, нужно подключить:
Код

#include <io.h>
#include <fcntl.h>


Можно, как  нибудь все это сделать одной командой??? может есть встроенная команда (для примера FileExists, определяет есть ли файл) для определения размера файла???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Romikgy
Дата 25.12.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



TFileStream::Size


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
codelord
Дата 25.12.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



знаю еще такие варинаты без доп подключений если есть vcl
Код

__int64 GetFileSize(AnsiString FileName)
{
__int64 h = FileOpen(FileName, fmOpenRead);
__int64 x = FileSeek(h, 0, 2); //pазмеp файла
FileClose(h);
return x;
}

или, с использованием GetFileSize, но ей всеравно нужен Handle файла:
Код

unsigned long filesize(char *dir /*Например: Temp:\*.* */)
{
HANDLE hFile;
hFile = CreateFile(dir,  // имя файла
    GENERIC_READ,                   // открываем для чтения
    0,                              // монопольно
    NULL,                           // без защиты
    OPEN_EXISTING,                  // только существующий файл
    FILE_ATTRIBUTE_NORMAL,          // нормальный файл
    NULL);
    unsigned long size;
    size=GetFileSize(hFile,NULL);
    CloseHandle(hFile);
    return size;
}

по скорости приблизительно одинаково работают, второй процентов на 15 быстрей.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 25.12.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



а что быстрее будет работать и стабильнее, прошлый код (см. выше) или новый???

новый код:
Код

void SizeFile(void)           //Подпрограмма определения размеров файлов     
{
for (int i=1; i<11; i++)
   {
   if(MyEnable[i])
      {
      if (FileExists(MyFile[i]))
         {
         TFileStream *GetSize = new TFileStream(MyFile[i], fmOpenRead);
         OldSize[i]=GetSize->Size;
         delete GetSize;
         }
      else
         OldSize[i]=(-1);
      }
   else
      OldSize[i]=(-1);
   }
}


или вот этот код:
Код

__int64 handle;
void SizeFile(void)           //Подпрограмма определения размеров файлов     
{
for (int i=1; i<11; i++)
   {
   if(MyEnable[i])
      {
      if (FileExists(MyFile[i]))
         {
         handle = FileOpen(MyFile[i], fmOpenRead);
         OldSize[i]=FileSeek(handle, 0, 2);
         FileClose(handle);
         }
      else
         OldSize[i]=(-1);
      }
   else
      OldSize[i]=(-1);
   }
}

[/code]

Это сообщение отредактировал(а) Bima - 25.12.2006, 15:35


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Romikgy
Дата 25.12.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



можно еще и через
FindFirstFile
FindClose
структура
WIN32_FIND_DATA .
DWORD    nFileSizeHigh; 
    DWORD    nFileSizeLow; 
Код

nFileSizeHigh

Specifies the high-order DWORD value of the file size, in bytes. This value is zero unless the file size is greater than MAXDWORD. The size of the file is equal to (nFileSizeHigh * MAXDWORD) + nFileSizeLow.

nFileSizeLow

Specifies the low-order DWORD value of the file size, in bytes.



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Anikmar
Дата 25.12.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



#include <IdGlobal.h>

Size = FileSizeByName("test.txt");
PM MAIL ICQ   Вверх
Bima
Дата 26.12.2006, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

#include <IdGlobal.h>

Size = FileSizeByName("test.txt"); 

Наверно это самый короткий код, но использовать компонент Indy(хотя я могу могу ошибаться), хм.

А все таки, что лучше использовать??? тут уже 4 реально работающих кода.
У меня приложение будет работать постоянно, то есть на серваке не меньше месяца. Код будет вызываться раз в минуту или реже.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 26.12.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



по моим тестам получилось так:
самый быстрый вариант:
тот который в моем посте второй там где
Код

size=GetFileSize(hFile,NULL);

потом около 15 % отставания от него способом fseek, 
далее приблизительно с отставанием 20-25% от первого идет способ с TFileStream,
c IdGlobal у меня не заработал начал ругаться на кругом расставленные GetTickCount();
вот так. пробовал вызывать функции на несколько тыс файлов никто не ругнулся. (хотя конечно проверки добавтить не помешало бы).


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
W4FhLF
Дата 26.12.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата

А все таки, что лучше использовать??? тут уже 4 реально работающих кода.
У меня приложение будет работать постоянно, то есть на серваке не меньше месяца. Код будет вызываться раз в минуту или реже.


Любой из вышеприведённых примеров прицнипиально друг от друга ничем не отличается, на уровне системы всё сводится к CreateFile/GetFileSize(ну или аналогичные API). Так зачем использовать эти обёртки? Сразу вызывай соответствующие API, как показал codelord.

Это сообщение отредактировал(а) W4FhLF - 26.12.2006, 08:55


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dumb
Дата 26.12.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



быстрее всего, по идее, должно быть таки через FindFirst, ибо при открытии файла все равно запись в каталоге читается.
PM MAIL   Вверх
W4FhLF
Дата 26.12.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Код

быстрее всего, по идее, должно быть таки через FindFirst, ибо при открытии файла все равно запись в каталоге читается.


FindFirstFile работает через пару функций ZwOpenFile/ZwQueryDirectoryFile. При этом уходит куча времени на преобразование ANSI строк в UNICODE и заполнении структуры WIN32_FIND_DATA. Другое дело, если сразу работать с FindFirstFileExW, тогда можно сэкономить кучу тактов.

Пара CreateFile/GetFileSize работает через пару функци ZwCreateFile/ZwQueryInformationFile, никаких заполнений структур здесь не происходит, но тоже много времени теряется на преобразовании ANSI > UNICODE.

Отсюда вывод, что оба примерно по скорости примерно одинаковы, если только использовать их W аналоги и работать с UNICODE строками. Быстрее тут ничего не придумаешь, ну разве что вызывать ядерные функции напрямую.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dumb
Дата 26.12.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



время выполнения непосредственно кода системных функций в данном случае не играет большой роли - основные задержки при обращении к диску(кэш не рассматриваем). предыдущий мой пост следует понимать именно в этом ключе - в какие дисковые операции "выливаются" эти варианты.
PM MAIL   Вверх
W4FhLF
Дата 26.12.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Так обращений к диску мы никак не избежим в любом случае, поэтому обсуждать это не имеет смысла. Лучше подумать как наиболее оптимально работать с функциями. Хотя, что тут думать и так всё ясно...


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dumb
Дата 27.12.2006, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(W4FhLF @  26.12.2006,  14:07 Найти цитируемый пост)
Так обращений к диску мы никак не избежим в любом случае, поэтому обсуждать это не имеет смысла.

дык не про "избегание" речь, а про возможное сокращение количества обращений.
а что до скорости работы кода функций, то естественно, выигрывает CreateFile/GetFileSize(~32k/sec), чуть медленнее с vcl-обвеской(ввиду ее малого объема) в виде FileOpen/FileSeek(~30k/sec), и отчаянно тормозит FindFirstFile(~8k/sec). (note: кол-во естественно привязано к конфиге).

дальше ковырять как-то ломает... можно, конечно, в дизасм углубиться, над файлмоном шаманить с фотоаппаратом, но... неинтересно, что ли... smile

edit: "то естественно, выигрывает" - эт я, пожалуй, перевозбудился. нифига это не было очевидным, хотя интуитивно ZwQueryDirectoryFile немного настораживало... smile

Это сообщение отредактировал(а) dumb - 27.12.2006, 05:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.