powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FOPEN возвращает 0, а не -1 и не >0 !!!
34 сообщений из 34, показаны все 2 страниц
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33101951
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, задолбал меня "глюк", проявляется случайным образом.

* cPath = пусто
* cFileName = полный путь к файлу

nFHandle = FOPEN(cPath+cFileName)
IF nFHandle<0
RETURN -1
ENDIF

а здесь уже nFHandle=0

Файл ни в фоксе, ни в параллельных задачах не держится, т.е. открываю только я сам. Если поставить точку останова на строку открытия и пройти по шагам, то файл открывается успешно!!! nFHandle > 40. А при выполнении блоком дает 0. Я уже не знаю откуда ноги растут.
Есть какие мысли?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33101971
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amid73Если поставить точку останова на строку открытия и пройти по шагам, то файл открывается успешно!!! nFHandle > 40. А при выполнении блоком дает 0.
Что означает фраза "при выполнении блоком"? Выделили в командном окне и нажал "Enter"? Ну, тогда все правильно! Выделенный фрагмент - это отдельный програмный файл. Все переменные, по умолчанию, внутри этого блока имеют область видимости PRIVATE и уничтожаются по завершении блока.

Ну, а если выпонение непосредственно в программе, то как определил область видимости переменной nFHandle? LOCAL, PRIVATE, PUBLIC? Где именно выполняешь проверку

"а здесь уже nFHandle=0"

"здесь" - это где? Сразу за блоком IF ... или что-то еще написано? Или вообще другая процедура?

Это вообще фрагмент чего? Метода формы (класса) или файл PRG?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102018
sergej_57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если надо работать с файлами на низком уровне, то чтобы было меньше геммороя - смотри в сторону функции FILETOSTR и STRTOFILE.
Файл перевел в переменную, обрабатываешь как обыкновенную переменную с использованием многочисленных строковых функций и массивов, а закончив обработку опять пишешь на диск обработанный файл.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102029
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блоком - я имел ввиду работу в ходе работы программы.

Структура программы линейная, ни классов, ни обьектов, примерно такая:

* функция обработки файла
...
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
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102041
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergej_57Если надо работать с файлами на низком уровне, то чтобы было меньше геммороя - смотри в сторону функции FILETOSTR и STRTOFILE.
Файл перевел в переменную, обрабатываешь как обыкновенную переменную с использованием многочисленных строковых функций и массивов, а закончив обработку опять пишешь на диск обработанный файл.
Есть опытные данные, по работе на файлах больших обьемов: скорость обработки файла на низком уровне в РАЗЫ БЫСТРЕЕ работы с переменной.
Причем пробовали различные варианты. Поэтому прошу не предлагать использование др.путей, я о них думал, в моем случае интересует конкретный вопрос, почему хэндл нулевой, а не как в документации?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102057
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amid73FUNC CheckFile
* nFHandle никак не обьявляется, т.е. видна из вызывающей функции
...
а здесь из-за 0-го хэндла FSEEK не отрабатывает как должен
...
RETURN 1
"Ну, вы, блин, даете" (с)

Жизненно важное для корректного функционирования процедуры значение НЕ передаете как параметр? И надеетесь, что сойдет с рук использованное сформированное в вызвавшей процедуре значение?

Надо именно передавать хендл как параметр. Да еще и проверять его корректность при входе в процедуру. Кроме повышения надежности кода Вы получите универсальную (до некоторой степени) процедуру не зависящую от способа ее вызова.

Надо примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
FUNC CheckFile
PARAMETERS tnFHandle
IF TYPE("tnFHandle")<>"N" OR m.tnFHandle<= 0 
	* некорректное значение параметра
	RETURN - 1 
ENDIF
...
RETURN  1 

Кроме того, опять пропущен кусок кода. Может, именно в нем дело. Похоже, у Вас происходит программное обнуление значение переменной. Именно в не описанном Вами кусе кода. "Просто так" значения переменных в FoxPro не меняются.

Кстати, о какой версии FoxPro идет речь?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102153
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллега, может я плохо обьясняю, но я уже несколько раз сказал,
что после строки "nFHandle = FOPEN(cPath+cFileName)"
уже в следующей строке nFHandle=0
о вызове каких-то там функций или другого кода после ENDIF речь не идет

как еще сказать?
nFHandle = FOPEN(cPath+cFileName)
IF nFHandle<0 && вот здесь уже nFHandle=0, если работает программа, если по шагам, то nFHandle>0
RETURN -1
ENDIF

кстати в открытой таблице в текущей области нет полей с именем "nFHandle" тоже
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102170
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну вот картинка мож поможет
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102181
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вариант по шагам
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102196
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия FoxPro

Количество переменных памяти

Объем оперативной памяти

Есть вероятность, что вылетели за допустимый предел (раз хендл > 40), либо по ограничениям FoxPro, либо по ограничениям железа.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102281
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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", его и не порулишь пожалуй.

Больше всего меня убивает разное поведение программы, работающей непрерывно и по шагам >:
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102342
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поскольку вылетает сразу после FOPEN(cPath+cFileName),
может присмотреться к cPath+cFileName ?
Попробовать с другими путями - может что-то изменится?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102755
Andrey Ts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя fopen должна вернуть -1, не пытаетесь ли вы все-таки открыть один и тот же файл дважды?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102759
Andrey Ts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще может сделать проверку жесткого диска?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102778
Andrey Ts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте сразу после fopen поставить

LIST STATUS NOCONSOLE TO FILE stat.txt

Результат выложите сюда, может поможет.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102919
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey Ts Хотя fopen должна вернуть -1, не пытаетесь ли вы все-таки открыть один и тот же файл дважды?
А ведь очень даже может быть! - Возможно даже где-нибудь происходит "задвоение" процедуры - По шагам, внутри процедуры, естественно, все будет нормально.
Надо еще попробовать "пошагать" дальше - через процедуры.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33102933
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если этот файл не закрывается на выходе из той же процедуры...
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103082
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey Ts, Crispy вы не внимательно смотрели сообщения, я уже говорил, что файл никем не держится, если файл держать, то FOPEN возвращает как и положено -1.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103093
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103152
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно... Судя по тексту, файл был открыт, но номер хендла указан равным нулю. Ни разу такого не встречал...

Кстати, DOEVENTS - не помогает?

Код: plaintext
1.
2.
DOEVENTS
nFHandle = FOPEN(cPath+cFileName)
...
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103166
Фотография ГенГрум
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а процедура случаем не из таймера запускается?


----------------------------------------------------------
Делай своё дело и будь что будет.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103252
Andrey Ts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторUser-opened files:
C:\TEMP\1\TEST_KVIT.VP3 Handle= 0 Pos= 0 Read=Yes Write= No
Банально, но все же: может ему не нравится в пути \1\ ?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103323
po2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
po2
Гость
Интересно, если изменить условие проверки, и прверять именно неуспешность открытия:
Код: plaintext
1.
2.
IF nFHandle=(- 1 )
RETURN - 1 
ENDIF
Будет работать с nFHandle = 0? Ведь в Help'е не сказано, что 0 это плохо.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103348
Gri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gri
Гость
автор
Если поставить точку останова на строку открытия и пройти по шагам, то файл открывается успешно!!! nFHandle > 40. А при выполнении блоком дает 0.


nFHandle = FOPEN(cPath+cFileName)
=INKEY(1)

IF nFHandle<0
RETURN -1
ENDIF

Mожет поможет
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103442
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
po2Ведь в Help'е не сказано, что 0 это плохо.

Я вот тоже хотел спросить - почему 0 считается ошибкой.
Ошибка - это -1. Хендлы с 1 по 5 - были стандартные в DOS'е, не знаю - присваевает Windows их или держит для совместимости. Что такое > 40? В LoadModule есть такое - описатель должен быть больше 31, а про FOPEN (ни в API CreateFile) нигде не написано, что 0 неправильно.
Попробуй исправить проверку на
IF nHandle = -1

может все будет работать нормально
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103487
Starpom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Была такая ошибка, но не в fox'е не под xp и давно. Решение было в измен. названия файла.
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33103673
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глупость скажу:

SP1 ставить не пробовали?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104009
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня nFHandle=0 устраивает, не устраивает то, что файловые операции с таким значением работают криво. В частности чтение файла при таком значении возможно только последовательно, а FSEEK зараза не работает...
Из-за это у меня проблеммы и возникли.

SP1 не ставил, но к сожалению такие же глюки были и на 6.0, правда крайне редко (
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104025
Andrey Ts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если этот глючный код выполнять из среды фокса, то результат хэндла тот же?
Кстати, интересно, что есть в системе хэндл 0? может какой-то нестандартный ввод-вывод?
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104130
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может все-таки - все дело - в пути ? (см.выше)
Можно еще попробовать почистить эту директорию - и посмотреть, что выйдет. Возможно там просто какое-нибудь неудаляемое или еще какое "чудо" лежит (бывают в винде такие файлы), которое и портит всю картину?

Для пробы - хотя бы путь сменить попробовать...
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104342
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело не в путях, ведь проходя 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), например) тоже не помогали :(
всем спасибо
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104627
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то верхнего кода вначале кажется - как бы и не было ;)

Выходит FindVersion - садился на голову Fopen?...
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104780
amid73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я его на картинке не показал, а так в 4-ом сообщении многоточием обозначил
И все равно на голове FOPEN сидит IF..ENDIF, уж должно было все работать как положено...
...
Рейтинг: 0 / 0
FOPEN возвращает 0, а не -1 и не >0 !!!
    #33104842
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно для полной отработки FindVersion нужна была пауза, созданная вставленной переиндексацией. Как она вообще отрабатывает? Может реально там какой-то файл создается, а потом удаляется? В STEP-е естественно этого и не будет заметно, а на результате FOPEN в "блоковом" выполнении - как-то значит и сказывалось. А как еще иначе можно объяснить? Можно другого рода паузу туда вставить - тоже по идее будет срабатывать как надо.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FOPEN возвращает 0, а не -1 и не >0 !!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]