Макс Кузнецов |
Отправлено: 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 );
} |
на вечный вопрос "что случилось и кто виноват" ответить не могу |
|
Макс Кузнецов |
Отправлено: 04.09.2004, 21:50 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
За пример спасибо конечно, но большая часть кода будет переноситься под никсы и поэтому использование для работы с файлами api-функций не желательно.
Все таки интересно, почему это происходит? Не писать же либу в студии для этой функции |
|
Макс Кузнецов |
Отправлено: 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 — напишу. |
Большое спасибо. А как ты это нашел?
Только вот у меня не сработало После выполнения батника появился такой лог:
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
Если нет то ... (лучше бы если да )
После отработки 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'у) |
|