Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Открыть одновременно текстовый файл для записи и чтения  [new]
itgun
Member

Откуда:
Сообщений: 6
Требуется, в одной программе, открыть текстовый файл для чтения, а в vfp, в это же время, этот же файл открыть для записи. fopen - с любыми параметрами, присылает -1
Пожалуйста, подскажите, как в фоксе открыть такой файл для записи
17 июл 15, 00:06    [17902381]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
itgun
Member

Откуда:
Сообщений: 6
Важно! файл д.б. постоянно открыт для чтения с одной стороны и для записи с другой. Вариант fopen-fclose не подходит. Возможно есть какието варианты открытия другими функциями, например winapi
17 июл 15, 01:03    [17902429]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
itgun,

А смысл всего этого какой? Один пишет - другой читает?
17 июл 15, 10:08    [17903078]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
Dima T
Member

Откуда:
Сообщений: 15281
FOPEN() не откроет файл если он открыт кем-то другим даже только на чтение.

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

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

Надо большего, кури WinAPI CreateFile() WriteFile() ReadFile()
17 июл 15, 10:25    [17903174]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
itgun
Member

Откуда:
Сообщений: 6
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 Подходит, но в ней невозможно переместить указатель в файле
17 июл 15, 11:00    [17903348]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
itgun
Member

Откуда:
Сообщений: 6
Dima T, STRTOFILE не подходит. Она открывает и закрывает - это долго. Требование -файл должен быть открыт. В этом и проблема)
17 июл 15, 11:04    [17903380]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
Ffffffffffffffffffffffffffffff
Guest
Значит, надо пользоваться технологиями FoxPro и писать в dbf, который предназначен для многопользовательского доступа.
17 июл 15, 11:08    [17903404]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
Dima T
Member

Откуда:
Сообщений: 15281
itgun,

что-то мне подсказывает что ты какой-то велосипед с квадратными колесами изобретаешь.
Лучше бы задачу описал вкратце. Думаю есть более удачные решения.
17 июл 15, 11:47    [17903614]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
itgun
Member

Откуда:
Сообщений: 6
Dima T,
точно велосипед :) если не трудно, можно пример использования в фоксе WriteFile()
17 июл 15, 12:18    [17903777]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Сам не использовал из фокса, родных средств всегда хватало. Отсюда 1376622
Один раз объявляешь
DECLARE INTEGER WriteFile IN kernel32 INTEGER hFile,;
STRING lpBuffer, INTEGER nBt2Write, INTEGER @ lpBtWritten, INTEGER lpOverlapped

Использовать так
m.buffer = "текст"
m.lenbuf = LEN(m.buffer)
m.written = 0
m.res = WriteFile(handle, m.buffer, m.lenbuf, @m.written, 0)


Только сначала надо открыть файл с помощью CreateFile() А там куча всяких разных флагов. Тут примеры использования 8963719 5738211
17 июл 15, 12:39    [17903922]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
itgun
Member

Откуда:
Сообщений: 6
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)
17 июл 15, 13:16    [17904156]     Ответить | Цитировать Сообщить модератору
 Re: Открыть одновременно текстовый файл для записи и чтения  [new]
Dima T
Member

Откуда:
Сообщений: 15281
itgun
set defa to "d:\"
lcFileName = "1.txt"

set defa тут лишнее, достаточно
  lcFileName = "d:\1.txt"  
17 июл 15, 14:16    [17904561]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить