| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Размер файла |
| Автор: Bima 25.12.2006, 14:24 | ||||||
есть код:
Здесь интересны всего три строки:
что бы их добавить, нужно подключить:
Можно, как нибудь все это сделать одной командой??? может есть встроенная команда (для примера FileExists, определяет есть ли файл) для определения размера файла??? |
| Автор: Romikgy 25.12.2006, 15:08 |
| TFileStream::Size |
| Автор: codelord 25.12.2006, 15:23 | ||||
знаю еще такие варинаты без доп подключений если есть vcl
или, с использованием GetFileSize, но ей всеравно нужен Handle файла:
по скорости приблизительно одинаково работают, второй процентов на 15 быстрей. |
| Автор: Bima 25.12.2006, 15:29 | ||||
| а что быстрее будет работать и стабильнее, прошлый код (см. выше) или новый??? новый код:
или вот этот код:
[/code] |
| Автор: Romikgy 25.12.2006, 16:33 | ||
| можно еще и через FindFirstFile FindClose структура WIN32_FIND_DATA . DWORD nFileSizeHigh; DWORD nFileSizeLow;
|
| Автор: Anikmar 25.12.2006, 17:12 |
| #include <IdGlobal.h> Size = FileSizeByName("test.txt"); |
| Автор: Bima 26.12.2006, 07:31 | ||
Наверно это самый короткий код, но использовать компонент Indy(хотя я могу могу ошибаться), хм. А все таки, что лучше использовать??? тут уже 4 реально работающих кода. У меня приложение будет работать постоянно, то есть на серваке не меньше месяца. Код будет вызываться раз в минуту или реже. |
| Автор: codelord 26.12.2006, 08:09 | ||
| по моим тестам получилось так: самый быстрый вариант: тот который в моем посте второй там где
потом около 15 % отставания от него способом fseek, далее приблизительно с отставанием 20-25% от первого идет способ с TFileStream, c IdGlobal у меня не заработал начал ругаться на кругом расставленные GetTickCount(); вот так. пробовал вызывать функции на несколько тыс файлов никто не ругнулся. (хотя конечно проверки добавтить не помешало бы). |
| Автор: W4FhLF 26.12.2006, 08:52 | ||
Любой из вышеприведённых примеров прицнипиально друг от друга ничем не отличается, на уровне системы всё сводится к CreateFile/GetFileSize(ну или аналогичные API). Так зачем использовать эти обёртки? Сразу вызывай соответствующие API, как показал codelord. |
| Автор: dumb 26.12.2006, 13:21 |
| быстрее всего, по идее, должно быть таки через FindFirst, ибо при открытии файла все равно запись в каталоге читается. |
| Автор: W4FhLF 26.12.2006, 13:38 | ||
FindFirstFile работает через пару функций ZwOpenFile/ZwQueryDirectoryFile. При этом уходит куча времени на преобразование ANSI строк в UNICODE и заполнении структуры WIN32_FIND_DATA. Другое дело, если сразу работать с FindFirstFileExW, тогда можно сэкономить кучу тактов. Пара CreateFile/GetFileSize работает через пару функци ZwCreateFile/ZwQueryInformationFile, никаких заполнений структур здесь не происходит, но тоже много времени теряется на преобразовании ANSI > UNICODE. Отсюда вывод, что оба примерно по скорости примерно одинаковы, если только использовать их W аналоги и работать с UNICODE строками. Быстрее тут ничего не придумаешь, ну разве что вызывать ядерные функции напрямую. |
| Автор: dumb 26.12.2006, 13:56 |
| время выполнения непосредственно кода системных функций в данном случае не играет большой роли - основные задержки при обращении к диску(кэш не рассматриваем). предыдущий мой пост следует понимать именно в этом ключе - в какие дисковые операции "выливаются" эти варианты. |
| Автор: W4FhLF 26.12.2006, 14:07 |
| Так обращений к диску мы никак не избежим в любом случае, поэтому обсуждать это не имеет смысла. Лучше подумать как наиболее оптимально работать с функциями. Хотя, что тут думать и так всё ясно... |