C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Открытие файлов в BCB6. Сколько можно открыть?
Макс Кузнецов
Отправлено: 04.09.2004, 20:26


Ученик-кочегар

Группа: Участник
Сообщений: 7



Столкнулся с такой проблемой:
Мне нужно открыть большое количество файлов. Делаю я это функцией open. И что я вижу, BCB6 открывает 50 файлов и ВСЕ, далее возвращает -1, хотя сами файлы на диске создает. Вставил этот же код в студию, там все пучком(открыл в цикле 2000 файлов — и они открылись), а в ВСВ6 это не проходит.
Вопрос:
Почему это происходит? Кто виноват? Что делать?
Георгий
Отправлено: 04.09.2004, 21:33


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



блин — действительно на ~50м файле облом.

попробуй через Win32API сделать — как в функции Test2
CODE
void Fauled(const int n)
       {
       AnsiString msg("fauled to open file ");
       msg+=n;
       throw Exception(msg);
       };

void Test1(const AnsiString& mask, const int max)
       {
       fstream *ptrStream=0;
       for (int i=0; i< max; ++i)
               {
               AnsiString fileName;
               fileName.printf( mask.c_str(), i );
               ptrStream=new fstream((fileName).c_str());
               if ( !ptrStream->is_open() )
                       Fauled( i );
               (*ptrStream)<<i<<endl;
               };
       };
void Test2(const AnsiString& mask, const int max)
       {
       DWORD dummy;
       for (int i=0; i< max; ++i)
               {
               AnsiString fileName;
               fileName.printf( mask.c_str(), i );
               HANDLE hFile = CreateFile(     fileName.c_str(), GENERIC_READ | GENERIC_WRITE, 0,
                               0, CREATE_ALWAYS,  FILE_ATTRIBUTE_NORMAL, 0 );

               if ( hFile == INVALID_HANDLE_VALUE )
                       Fauled( i );
               AnsiString str;
               str = i;
               WriteFile( hFile, str.c_str(), str.Length() + 1, &dummy, 0 );
               };
       };

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString mask( "d:\\temp\\%i." );
const int max = 20000;
Test1( mask + 1, max );
Test2( mask + 2, max );
}


на вечный вопрос "что случилось и кто виноват" ответить не могу smile.gif
Макс Кузнецов
Отправлено: 04.09.2004, 21:50


Ученик-кочегар

Группа: Участник
Сообщений: 7



За пример спасибо конечно, но большая часть кода будет переноситься под никсы и поэтому использование для работы с файлами api-функций не желательно.
Все таки интересно, почему это происходит? Не писать же либу в студии для этой функции sad.gif
Макс Кузнецов
Отправлено: 06.09.2004, 23:42


Ученик-кочегар

Группа: Участник
Сообщений: 7



Люди, а вы не могли бы попробовать открыть много файлов в каком-нить другом билдере, например в 5-м?
Asher
Отправлено: 07.09.2004, 07:44


Мастер участка

Группа: Модератор
Сообщений: 550



в 5-м 47
Win2k sp3

Отредактировано Asher — 07/09/2004, 10:18
AVC
Отправлено: 07.09.2004, 08:01


Ветеран

Группа: Модератор
Сообщений: 1583



С такой проблемой сталкивался еще на Borland tc2 (50 файлов). Было не актуально — не решал.
Gedeon
Отправлено: 07.09.2004, 08:12


Ветеран

Группа: Модератор
Сообщений: 1742



Похоже конечно на затык борланда, однако тут у меня вопрос возник а под какими опрационками пробовалось?

Win XP SP1 BCB 6 Upd4 — 49 файлов

Отредактировано Gedeon — 07/09/2004, 09:29
AVC
Отправлено: 07.09.2004, 08:25


Ветеран

Группа: Модератор
Сообщений: 1583



Dos 5 (насколько помню). Естественно системные настройки были выполнены правильно.
Gedeon
Отправлено: 07.09.2004, 08:29


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 07/09/2004, 09:27)
Dos 5 (насколько помню). Естественно системные настройки были выполнены правильно.

Мдя, тады ось не виновата.
Тут мысль еще такая, если запихнуть это в длл и файлы из нее создавать, хотя это так попробовать, но должно же быть обьяснение.
Макс Кузнецов
Отправлено: 07.09.2004, 12:09


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE (Gedeon @ 07/09/2004, 09:14)
Похоже конечно на затык борланда, однако тут у меня вопрос возник а под какими опрационками пробовалось?

Win XP SP1 BCB 6 Upd4 — 49 файлов

Пробовал под Win2000+sp4.

Блин, ну ведь это не дело, почему в студии все ок? А можно у борланда как-нить ответа запросить?
AVC
Отправлено: 07.09.2004, 13:05


Ветеран

Группа: Модератор
Сообщений: 1583



Builder 5
Ноги растут отсюда Include\_nfile.h
меняем #define _NFILE_ 250
идем в Source\RTL
читаем readme
выполняем build.bat
долго ожидаем ....
теперь открывает 125 файлов (почему?)

PS. Если разберусь почему 125 — напишу.
Gedeon
Отправлено: 07.09.2004, 14:16


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 07/09/2004, 14:07)
PS. Если разберусь почему 125 — напишу.

У меня предположение 125 = 250/2, хотя перебилдить не пытался, но изначально 50 и открывается 49, действительно почему только половина? А если еще больше число увеличить 1000 например?
avc*
Отправлено: 07.09.2004, 14:36


Не зарегистрирован







У меня изначально открывалось 47 (Win2000). %) = 47 + 3std. По исходникам все массивы имеют размер [_NFILE_]
Кстати. Уменьшение значения переменной
extern unsigned _RTLENTRY _EXPDATA _nfile;
при выполнении приложения до 50 возвращает к старой ситуации (что закономерно) и позволяет открыть опять 47 файлов.
Макс Кузнецов
Отправлено: 07.09.2004, 22:43


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE (AVC @ 07/09/2004, 14:07)
Builder 5
Ноги растут отсюда Include\_nfile.h
меняем #define _NFILE_ 250
идем в Source\RTL
читаем readme
выполняем build.bat
долго ожидаем ....
теперь открывает 125 файлов (почему?)

PS. Если разберусь почему 125 — напишу.

Большое спасибо. А как ты это нашел?
Только вот у меня не сработало sad.gif После выполнения батника появился такой лог:

Building...
make -DMT all
MAKE Version 5.2 Copyright © 1987, 2000 Borland

** error 1 ** deleting start

Что это за ботва?
AVC
Отправлено: 08.09.2004, 07:56


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Большое спасибо. А как ты это нашел?
Только вот у меня не сработало  После выполнения батника появился такой лог:

1. Просмотрел stdio.h
2. А все сделано как написано в readme? У меня сработало с первого раза без проблем.
Макс Кузнецов
Отправлено: 08.09.2004, 23:27


Ученик-кочегар

Группа: Участник
Сообщений: 7



Я конечно извиняюсь, но я не совсем понимаю, что там написано. Я просто батник запустил.
Не объяснишь правильную последовательность действий?
AVC
Отправлено: 09.09.2004, 08:18


Ветеран

Группа: Модератор
Сообщений: 1583



Если rtl поставлен вместе с Builder'ом (на hd) то нужно, что бы в путях был путь к папке ...\Source\RTL\Tools
set PATH=%PATH%;где_у_вас_размешен_Builder\SOURCE\RTL\TOOLS

Если нет то ... (лучше бы если да smile.gif )

После отработки bat из папки SOURCE\RTL\LIB файлы *.OBJ & *.LIB скопировать в CBuilder\Lib, а файлы *.DLL & *.TDS в CBuilder\Bin
Макс Кузнецов
Отправлено: 09.09.2004, 11:36


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE (AVC @ 09/09/2004, 09:20)
Если rtl поставлен вместе с Builder'ом (на hd) то нужно, что бы в путях был путь к папке ...\Source\RTL\Tools
set PATH=%PATH%;где_у_вас_размешен_Builder\SOURCE\RTL\TOOLS

Вот это-то и не совсем понял. Все поставлено вместе с билдером.
А что нужно сделать? Где устанавливать эти параметры?
avc*
Отправлено: 09.09.2004, 11:56


Не зарегистрирован







Например первой строкой в build.bat (Не забудьте проставить правильный путь к Builder'у)

Вернуться в Вопросы программирования в C++Builder