powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Открыть одновременно текстовый файл для записи и чтения
12 сообщений из 12, страница 1 из 1
Открыть одновременно текстовый файл для записи и чтения
    #39009383
itgun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Требуется, в одной программе, открыть текстовый файл для чтения, а в vfp, в это же время, этот же файл открыть для записи. fopen - с любыми параметрами, присылает -1
Пожалуйста, подскажите, как в фоксе открыть такой файл для записи
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009395
itgun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Важно! файл д.б. постоянно открыт для чтения с одной стороны и для записи с другой. Вариант fopen-fclose не подходит. Возможно есть какието варианты открытия другими функциями, например winapi
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009531
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itgun,

А смысл всего этого какой? Один пишет - другой читает?
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009551
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOPEN() не откроет файл если он открыт кем-то другим даже только на чтение.

Если надо писать в конец
Код: sql
1.
StrToFile(lcText, lcFile, .T.)


допишет в файл если кто-то его открыл на чтение, но открытым не держит. Я так логи пишу.

Надо большего, кури WinAPI CreateFile() WriteFile() ReadFile()
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009604
itgun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG,

Так точно. Сетевая работа с текстовым файлом. Но запись ведет только один пользователь, остальные читают. Вся проблема в том что fopen с любыми параметрами для записи открывает в эксклюзивном режиме.
Вот что нашел на замену :
1) Нашел функцию writefile в win32. http://www.news2news.com/vfp/?group=27&function=301 Если знаете как ее использовать в vfp буду благодарен помощи
2) нашел CreateObject("Scripting.FileSystemObject") https://msdn.microsoft.com/en-us/library/aa242706(v=vs.60).aspx Подходит, но в ней невозможно переместить указатель в файле
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009616
itgun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, STRTOFILE не подходит. Она открывает и закрывает - это долго. Требование -файл должен быть открыт. В этом и проблема)
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009626
Значит, надо пользоваться технологиями FoxPro и писать в dbf, который предназначен для многопользовательского доступа.
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009690
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itgun,

что-то мне подсказывает что ты какой-то велосипед с квадратными колесами изобретаешь.
Лучше бы задачу описал вкратце. Думаю есть более удачные решения.
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009735
itgun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
точно велосипед :) если не трудно, можно пример использования в фоксе WriteFile()
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009772
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам не использовал из фокса, родных средств всегда хватало. Отсюда 1376622
Один раз объявляешь
Код: sql
1.
2.
DECLARE INTEGER WriteFile IN kernel32 INTEGER hFile,;
STRING lpBuffer, INTEGER nBt2Write, INTEGER @ lpBtWritten, INTEGER lpOverlapped


Использовать так
Код: sql
1.
2.
3.
4.
m.buffer = "текст"
m.lenbuf = LEN(m.buffer)
m.written = 0
m.res = WriteFile(handle, m.buffer, m.lenbuf, @m.written, 0)



Только сначала надо открыть файл с помощью CreateFile() А там куча всяких разных флагов. Тут примеры использования 8963719 5738211
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009823
itgun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, огромное спасибо за помощь. writefile прекрасно работает. Чтобы закрыть тему приведу пример кода который я получил в итоге


* DEFINEs for file share mode.
#DEFINE FILE_SHARE_READ 1
#DEFINE FILE_SHARE_WRITE 2

* DEFINEs for access right
#DEFINE GENERIC_READ 0x80000000
#DEFINE GENERIC_WRITE 0x40000000

* DEFINES for Create Mode.
#DEFINE CREATE_NEW 1
#DEFINE CREATE_ALWAYS 2
#DEFINE OPEN_EXISTING 3
#DEFINE OPEN_ALWAYS 4
#DEFINE TRUNCATE_EXISTING 5

#DEFINE FILE_ATTRIBUTE_NORMAL 0x80

DECLARE INTEGER CreateFile IN WIN32API ;
STRING lpFileName, ;
INTEGER dwDesiredAccess, ;
INTEGER dwShareMode, ;
INTEGER lpSecurityAttributes, ;
INTEGER dwCreationDisposition, ;
INTEGER dwFlagsAndAttributes, ;
INTEGER hTemplateFile

DECLARE INTEGER GetLastError IN WIN32API

DECLARE INTEGER WriteFile IN WIN32API ;
INTEGER hFile, ;
STRING lpBuffer, ;
INTEGER nNumberOfBytesToWrite, ;
INTEGER @ lpNumberOfBytesWritten, ;
INTEGER lpOverlapped

DECLARE INTEGER SetFilePointer IN WIN32API ;
INTEGER hFile, ;
INTEGER lDistanceToMove, ;
INTEGER lpDistanceToMoveHigh, ;
INTEGER dwMoveMethod

DECLARE INTEGER CloseHandle IN WIN32API ;
INTEGER hObject

LOCAL lcFileName, lhFileHandle, ln1, lcData, lnBytesWritten, llRes
set defa to "d:\"
lcFileName = "1.txt"

lhFileHandle = CreateFile(m.lcFileName, BITOR(GENERIC_READ, GENERIC_WRITE), ;
FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

IF m.lhFileHandle <= 0
MESSAGEBOX ("Error in CreateFile: Error code - " + ;
LTRIM(STR(GetLastError())))
RETURN .F.
ENDIF


SET HOURS TO 24
SET DATE GERMAN
FOR ln1 = 1 TO 5
lcData = TTOC(DATETIME()) + " " + LTRIM(STR(m.ln1)) + CHR(13) + CHR(10)
lnBytesWritten = 0
llRes = WriteFile(m.lhFileHandle, m.lcData, LEN(m.lcData), @lnBytesWritten, 0)
IF m.llRes = 0
MESSAGEBOX ("Error in WriteFile: Error code - " + ;
LTRIM(STR(GetLastError())))
EXIT
ENDIF
llRes = SetFilePointer(m.lhFileHandle, 0,0,0)
WAIT WINDOW m.lcData TIMEOUT 1
ENDFOR

CloseHandle(m.lhFileHandle)
...
Рейтинг: 0 / 0
Открыть одновременно текстовый файл для записи и чтения
    #39009907
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itgun set defa to "d:\"
lcFileName = "1.txt"

set defa тут лишнее, достаточно
Код: sql
1.
  lcFileName = "d:\1.txt"  
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Открыть одновременно текстовый файл для записи и чтения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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