|
|
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Коллеги, задолбал меня "глюк", проявляется случайным образом. * cPath = пусто * cFileName = полный путь к файлу nFHandle = FOPEN(cPath+cFileName) IF nFHandle<0 RETURN -1 ENDIF а здесь уже nFHandle=0 Файл ни в фоксе, ни в параллельных задачах не держится, т.е. открываю только я сам. Если поставить точку останова на строку открытия и пройти по шагам, то файл открывается успешно!!! nFHandle > 40. А при выполнении блоком дает 0. Я уже не знаю откуда ноги растут. Есть какие мысли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 09:23:37 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
amid73Если поставить точку останова на строку открытия и пройти по шагам, то файл открывается успешно!!! nFHandle > 40. А при выполнении блоком дает 0. Что означает фраза "при выполнении блоком"? Выделили в командном окне и нажал "Enter"? Ну, тогда все правильно! Выделенный фрагмент - это отдельный програмный файл. Все переменные, по умолчанию, внутри этого блока имеют область видимости PRIVATE и уничтожаются по завершении блока. Ну, а если выпонение непосредственно в программе, то как определил область видимости переменной nFHandle? LOCAL, PRIVATE, PUBLIC? Где именно выполняешь проверку "а здесь уже nFHandle=0" "здесь" - это где? Сразу за блоком IF ... или что-то еще написано? Или вообще другая процедура? Это вообще фрагмент чего? Метода формы (класса) или файл PRG? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 09:35:09 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Если надо работать с файлами на низком уровне, то чтобы было меньше геммороя - смотри в сторону функции FILETOSTR и STRTOFILE. Файл перевел в переменную, обрабатываешь как обыкновенную переменную с использованием многочисленных строковых функций и массивов, а закончив обработку опять пишешь на диск обработанный файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 09:59:41 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Блоком - я имел ввиду работу в ходе работы программы. Структура программы линейная, ни классов, ни обьектов, примерно такая: * функция обработки файла ... PRIVATE nFHandle ... nFHandle = FOPEN(cPath+cFileName) IF nFHandle<0 RETURN -1 ENDIF ... IF CheckFile()<0 ... ENDIF ... FUNC CheckFile * nFHandle никак не обьявляется, т.е. видна из вызывающей функции ... а здесь из-за 0-го хэндла FSEEK не отрабатывает как должен ... RETURN 1 Точку останова ставлю на команду открытия, далее по шагам - хэндл нормальный, точку ставлю на след.строку "IF nFHandle<0", хэндл=0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 10:08:22 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
sergej_57Если надо работать с файлами на низком уровне, то чтобы было меньше геммороя - смотри в сторону функции FILETOSTR и STRTOFILE. Файл перевел в переменную, обрабатываешь как обыкновенную переменную с использованием многочисленных строковых функций и массивов, а закончив обработку опять пишешь на диск обработанный файл. Есть опытные данные, по работе на файлах больших обьемов: скорость обработки файла на низком уровне в РАЗЫ БЫСТРЕЕ работы с переменной. Причем пробовали различные варианты. Поэтому прошу не предлагать использование др.путей, я о них думал, в моем случае интересует конкретный вопрос, почему хэндл нулевой, а не как в документации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 10:12:17 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
amid73FUNC CheckFile * nFHandle никак не обьявляется, т.е. видна из вызывающей функции ... а здесь из-за 0-го хэндла FSEEK не отрабатывает как должен ... RETURN 1 "Ну, вы, блин, даете" (с) Жизненно важное для корректного функционирования процедуры значение НЕ передаете как параметр? И надеетесь, что сойдет с рук использованное сформированное в вызвавшей процедуре значение? Надо именно передавать хендл как параметр. Да еще и проверять его корректность при входе в процедуру. Кроме повышения надежности кода Вы получите универсальную (до некоторой степени) процедуру не зависящую от способа ее вызова. Надо примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Кроме того, опять пропущен кусок кода. Может, именно в нем дело. Похоже, у Вас происходит программное обнуление значение переменной. Именно в не описанном Вами кусе кода. "Просто так" значения переменных в FoxPro не меняются. Кстати, о какой версии FoxPro идет речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 10:25:08 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Коллега, может я плохо обьясняю, но я уже несколько раз сказал, что после строки "nFHandle = FOPEN(cPath+cFileName)" уже в следующей строке nFHandle=0 о вызове каких-то там функций или другого кода после ENDIF речь не идет как еще сказать? nFHandle = FOPEN(cPath+cFileName) IF nFHandle<0 && вот здесь уже nFHandle=0, если работает программа, если по шагам, то nFHandle>0 RETURN -1 ENDIF кстати в открытой таблице в текущей области нет полей с именем "nFHandle" тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 11:15:01 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
ну вот картинка мож поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 11:19:55 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
вариант по шагам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 11:23:47 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Версия FoxPro Количество переменных памяти Объем оперативной памяти Есть вероятность, что вылетели за допустимый предел (раз хендл > 40), либо по ограничениям FoxPro, либо по ограничениям железа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 11:27:47 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
VFP 8.0 (08.00.0000.2521) 91 variables defined, 1045 bytes used 16293 variables available RAM 512Mb config.nt я думаю здесь не при чем, там files=200 поставил (но это ж для ДОС) для VFP ограничение "Maximum # of open files" - "System limit", его и не порулишь пожалуй. Больше всего меня убивает разное поведение программы, работающей непрерывно и по шагам >: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 11:58:27 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Поскольку вылетает сразу после FOPEN(cPath+cFileName), может присмотреться к cPath+cFileName ? Попробовать с другими путями - может что-то изменится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 12:22:32 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Хотя fopen должна вернуть -1, не пытаетесь ли вы все-таки открыть один и тот же файл дважды? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 15:01:27 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Еще может сделать проверку жесткого диска? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 15:04:52 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Попробуйте сразу после fopen поставить LIST STATUS NOCONSOLE TO FILE stat.txt Результат выложите сюда, может поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 15:09:24 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Andrey Ts Хотя fopen должна вернуть -1, не пытаетесь ли вы все-таки открыть один и тот же файл дважды? А ведь очень даже может быть! - Возможно даже где-нибудь происходит "задвоение" процедуры - По шагам, внутри процедуры, естественно, все будет нормально. Надо еще попробовать "пошагать" дальше - через процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 15:54:56 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Если этот файл не закрывается на выходе из той же процедуры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 15:57:45 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Andrey Ts, Crispy вы не внимательно смотрели сообщения, я уже говорил, что файл никем не держится, если файл держать, то FOPEN возвращает как и положено -1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 16:42:46 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Processor is Pentium Select area: 12, Table in Use: C:\TEMP\KB1C01BA.TMP (Readonly) Alias: SQLRESULT Code page: 1251 Lock(s): Exclusive USE Currently Selected Table: Select area: 9, Table in Use: D:\CNT-KS\CKS-TMP\C_SYNDBF.DBF Alias: C_SYNDBF Code page: 1251 Lock(s): Exclusive USE Select area: 6, Table in Use: D:\CNT-KS\CKS-TMP\C_RQ2.DBF Alias: C_RQ2 Code page: 1251 Lock(s): Exclusive USE Select area: 3, Table in Use: D:\CNT-KS\CKS-TMP\C_RQ1.DBF Alias: C_RQ1 Code page: 1251 Lock(s): Exclusive USE Select area: 4, Table in Use: C:\TEMP\KB1C014R.TMP Alias: C_24_1JC0ZNN65 Code page: 1251 Lock(s): Exclusive USE Select area: 8, Table in Use: D:\CNT-KS\CKS-TMP\C_24_BUFFER_1JC0ZNDB6.DBF Alias: C_24_BUFFER_1JC0ZNDB6 Code page: 1251 Memo file: D:\CNT-KS\CKS-TMP\C_24_BUFFER_1JC0ZNDB6.FPT Lock(s): Exclusive USE Select area: 7, Table in Use: D:\CNT-KS\CKS-TMP\C_24_F_C_1JC0ZNDB5.DBF Alias: C_24_F_C_1JC0ZNDB5 Code page: 1251 Memo file: D:\CNT-KS\CKS-TMP\C_24_F_C_1JC0ZNDB5.FPT Lock(s): Exclusive USE Select area: 5, Table in Use: D:\CNT-KS\CKS-TMP\C_24_G_D_1JC0ZNDB4.DBF Alias: C_24_G_D_1JC0ZNDB4 Code page: 1251 Master index file: D:\CNT-KS\CKS-TMP\C_24_G_D_1JC0ZNDB4.IDX Key: SORT Collate: Machine Memo file: D:\CNT-KS\CKS-TMP\C_24_G_D_1JC0ZNDB4.FPT Lock(s): Exclusive USE Select area: 1, Table in Use: C:\TEMP\KB1C000E.TMP Alias: SYS_EDIT_OBJ Code page: 1251 Lock(s): Exclusive USE Class libraries: E:\APP_PUB\ALIB\ALIB.VCX ALIAS ALIB, E:\APP_PUB\ALIB\_UI.VCX ALIAS _UI, E:\APP_PUB\ALIB\_BASE.VCX ALIAS _BASE, E:\VBUH\ADE\_AUX\DN.VCX ALIAS DN User-opened files: C:\TEMP\1\TEST_KVIT.VP3 Handle= 0 Pos= 0 Read=Yes Write= No File search path: D:\CNT-KS\CKS-TMP\NEW_WORK;E:\VBUH;E:\APP_PUB\COMM;E:\VBUH\COMM;E:\VBUH\EOD;E:\VBUH\EOD\CONVERTERS;E:\VBUH\ADE;E:\VBUH\ADE\_AUX;E:\APP_PUB\ADMIN;E:\VBUH\INP_DOC;E:\APP_PUB\ADM;E:\APP_PUB\ARH\;E:\APP_PUB\ALIB\;E:\VBUH\RED_SPR\;E:\APP_PUB\OBJ_EDIT\;E:\VB... Default directory: D:\CNT-KS\CKS-TMP Print file/device: Work area = 9 Margin = 0 Decimals = 2 Memowidth = 50 Typeahead = 20 Blocksize = 64 Reprocess = 0 Refresh = 0,5 SECONDS DDE Timeout = 2000 DDE Safety = on Code page: 1251 Collating sequence: Machine Compiler code page: 1251 Date format: German Macro Hot Key = UDF parameters are passed by: VALUE Textmerge Options Delimiters: Left = << Right = >> Show Alternate - off Confirm - off Fullpath - on Print - off ANSI - off Console - off Heading - on Readborder - off Asserts - off Cursor - on Help - on Safety - off Bell - off Deleted - on Intensity - on Space - on Blink - on Device - scrn Lock - off Status Bar - on Brstatus - off Echo - on Logerrors - on Sysmenus - on Carry - off Escape - on Mouse - on Talk - off Century - on Exact - on Multilocks - off Textmerge - off Clear - on Exclusive - on Near - off Title - off Color - on Fields - off Null - off Unique - off Compatible - off Fixed - off Optimize - on Declared DLLs: aux1 e:\app_pub\dll\budget.dll CharToOem C:\WINDOWS\system32\USER32.dll CreateDirectory C:\WINDOWS\system32\kernel32.dll DeleteFile C:\WINDOWS\system32\kernel32.dll GetActiveWindow C:\WINDOWS\system32\USER32.dll GetCurrentProcess C:\WINDOWS\system32\kernel32.dll GetDC C:\WINDOWS\system32\USER32.dll GetDesktopWindow C:\WINDOWS\system32\USER32.dll GetDeviceCaps C:\WINDOWS\system32\GDI32.dll GetLastError C:\WINDOWS\system32\kernel32.dll GetShortPathName C:\WINDOWS\system32\kernel32.dll LockWindowUpdate C:\WINDOWS\system32\USER32.dll OemToChar C:\WINDOWS\system32\USER32.dll RemoveDirectory C:\WINDOWS\system32\kernel32.dll WaitForSingleObject C:\WINDOWS\system32\kernel32.dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 16:46:54 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Интересно... Судя по тексту, файл был открыт, но номер хендла указан равным нулю. Ни разу такого не встречал... Кстати, DOEVENTS - не помогает? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 17:02:09 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
а процедура случаем не из таймера запускается? ---------------------------------------------------------- Делай своё дело и будь что будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 17:04:00 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
авторUser-opened files: C:\TEMP\1\TEST_KVIT.VP3 Handle= 0 Pos= 0 Read=Yes Write= No Банально, но все же: может ему не нравится в пути \1\ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 17:33:46 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Интересно, если изменить условие проверки, и прверять именно неуспешность открытия: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 17:57:34 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
автор Если поставить точку останова на строку открытия и пройти по шагам, то файл открывается успешно!!! nFHandle > 40. А при выполнении блоком дает 0. nFHandle = FOPEN(cPath+cFileName) =INKEY(1) IF nFHandle<0 RETURN -1 ENDIF Mожет поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 18:06:27 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
po2Ведь в Help'е не сказано, что 0 это плохо. Я вот тоже хотел спросить - почему 0 считается ошибкой. Ошибка - это -1. Хендлы с 1 по 5 - были стандартные в DOS'е, не знаю - присваевает Windows их или держит для совместимости. Что такое > 40? В LoadModule есть такое - описатель должен быть больше 31, а про FOPEN (ни в API CreateFile) нигде не написано, что 0 неправильно. Попробуй исправить проверку на IF nHandle = -1 может все будет работать нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 18:39:47 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Была такая ошибка, но не в fox'е не под xp и давно. Решение было в измен. названия файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 19:00:12 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Глупость скажу: SP1 ставить не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2005, 23:23:02 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Меня nFHandle=0 устраивает, не устраивает то, что файловые операции с таким значением работают криво. В частности чтение файла при таком значении возможно только последовательно, а FSEEK зараза не работает... Из-за это у меня проблеммы и возникли. SP1 не ставил, но к сожалению такие же глюки были и на 6.0, правда крайне редко ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 10:01:59 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
А если этот глючный код выполнять из среды фокса, то результат хэндла тот же? Кстати, интересно, что есть в системе хэндл 0? может какой-то нестандартный ввод-вывод? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 10:06:09 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
А может все-таки - все дело - в пути ? (см.выше) Можно еще попробовать почистить эту директорию - и посмотреть, что выйдет. Возможно там просто какое-нибудь неудаляемое или еще какое "чудо" лежит (бывают в винде такие файлы), которое и портит всю картину? Для пробы - хотя бы путь сменить попробовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 10:42:52 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Дело не в путях, ведь проходя FOPEN по шагам хэндл нормальный получается на том же файле. Кажись решил проблему, перед FOPEN был блок IF...ENDIF, поставил между ними блок команд работы с DBF (выбор области и индексация по полю), который был ниже FOPEN и пока работает успешно и без отладчика :/ ... cStr = FindVersion(cVersion,'pp') IF !EMPTY(cStr) =j_sys_report(cStr,,,[RED]) RETURN -1 ENDIF SELECT c_j_sformat && перенес снизу INDEX ON ver TAG ver && перенес снизу nFHandle = FOPEN(cPath+cFileName) IF nFHandle<0 =FCLOSE(nFHandle) RETURN -1 ENDIF ... вобщем непонятки какие-то, файловых операций выше не было, там все на уровне select-ов, чего-то фокс не успевает сделать до файловых операций на низком уровне, причем паузы (inkey(1), например) тоже не помогали :( всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 11:38:27 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Что-то верхнего кода вначале кажется - как бы и не было ;) Выходит FindVersion - садился на голову Fopen?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 12:46:10 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Я его на картинке не показал, а так в 4-ом сообщении многоточием обозначил И все равно на голове FOPEN сидит IF..ENDIF, уж должно было все работать как положено... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 13:30:42 |
|
||
|
FOPEN возвращает 0, а не -1 и не >0 !!!
|
|||
|---|---|---|---|
|
#18+
Возможно для полной отработки FindVersion нужна была пауза, созданная вставленной переиндексацией. Как она вообще отрабатывает? Может реально там какой-то файл создается, а потом удаляется? В STEP-е естественно этого и не будет заметно, а на результате FOPEN в "блоковом" выполнении - как-то значит и сказывалось. А как еще иначе можно объяснить? Можно другого рода паузу туда вставить - тоже по идее будет срабатывать как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2005, 13:52:56 |
|
||
|
|

start [/forum/topic.php?all=1&fid=41&tid=1594101]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
208ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 562ms |

| 0 / 0 |
