Open file as shared (Update)
Posted: Sun Feb 21, 2010 4:01 pm
How to find a code to open file as shared. PB ReadFile open files as explicit!
Thanks
Thanks
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
;-TOP
; Kommentar :
; Author : mk-soft
; Second Author :
; Datei : files.pb
; Version : 1.02
; Erstellt : 24.02.2010
; Geändert : 28.02.2010
;
; Compilermode :
;
; ***************************************************************************************
EnableExplicit
Structure udtMyFile
hFile.i
lpReOpenBuff.OFSTRUCT
Eof.i
EndStructure
Global NewList MyFile.udtMyFile()
Global FileLastError
; ***************************************************************************************
Procedure MyIsFile(File)
ForEach MyFile()
If MyFile() = File
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
; ***************************************************************************************
Procedure MyOpenFile(filename.s, uStyle = #OF_READ)
Protected hFile
Protected lpReOpenBuff.OFSTRUCT
Protected result
hFile = OpenFile_(@filename, lpReOpenBuff, uStyle)
If hFile = 0
FileLastError = GetLastError_()
ProcedureReturn 0
Else
result = AddElement(MyFile())
With MyFile()
\hFile = hFile
\lpReOpenBuff = lpReOpenBuff
\Eof = #False
EndWith
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure MyCloseFile(File)
Protected r1
If File
ChangeCurrentElement(MyFile(), File)
r1 = CloseHandle_(MyFile()\hFile)
If r1 = 0
FileLastError = GetLastError_()
EndIf
DeleteElement(MyFile())
EndIf
ProcedureReturn r1
EndProcedure
; ***************************************************************************************
Procedure.q MyLof(File)
Protected result.q
Protected dwError.i
Protected dwSizeLow.l
Protected dwSizeHigh.l
If File = 0
ProcedureReturn -1
EndIf
ChangeCurrentElement(MyFile(), File)
dwSizeLow = GetFileSize_(MyFile()\hFile, @dwSizeHigh)
If dwSizeLow = $FFFFFFFF
dwError = GetLastError_()
If dwError <> #NO_ERROR
FileLastError = dwError
ProcedureReturn -1
EndIf
Else
result = (dwSizeHigh << 32) | dwSizeLow
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure MyEof(*File.udtMyFile)
ProcedureReturn *File\Eof
EndProcedure
; ***************************************************************************************
Procedure.q MySeekFile(File, position.q)
Protected result.q
Protected dwError.i
Protected dwPosLow.l
Protected dwPosHigh.l
If File = 0
ProcedureReturn 0
EndIf
dwPosLow = position & $FFFFFFFF
dwPosHigh = position >> 32
ChangeCurrentElement(MyFile(), File)
dwPosLow = SetFilePointer_(MyFile()\hFile, dwPosLow, @dwPosHigh, #FILE_BEGIN)
If dwPosLow = $FFFFFFFF
dwError = GetLastError_()
If dwError <> #NO_ERROR
FileLastError = dwError
ProcedureReturn -1
EndIf
Else
result = (dwPosHigh << 32) | dwPosLow
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure.s MyReadString(File)
Protected lpBuffer.Character, nNumberOfBytesToRead, lpNumberOfByteRead
Protected r1
Protected result.s
Protected LastChar.c = 0
If File = 0
ProcedureReturn ""
EndIf
ChangeCurrentElement(MyFile(), File)
nNumberOfBytesToRead = 1
result = ""
Repeat
r1 = ReadFile_(MyFile()\hFile, @lpBuffer, nNumberOfBytesToRead, @lpNumberOfByteRead, #Null)
If r1 = 0
Break
Else
If lpNumberOfByteRead = 0
MyFile()\Eof = #True
Break
EndIf
If LastChar = #LF And lpBuffer\c = #CR
Break
ElseIf LastChar = #CR And lpBuffer\c = #LF
Break
ElseIf LastChar = #CR Or LastChar = #LF
SetFilePointer_(MyFile()\hFile, -1, 0, #FILE_CURRENT)
Break
Else
If lpBuffer\c <> #CR And lpBuffer\c <> #LF
result + Chr(lpBuffer\c)
EndIf
EndIf
LastChar = lpBuffer\c
EndIf
ForEver
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Code: Select all
test1
test2
test3
Code: Select all
;-TOP
; Kommentar :
; Author : mk-soft
; Second Author :
; Datei : files.pb
; Version : 1.02
; Erstellt : 24.02.2010
; Geändert : 28.02.2010
;
; Compilermode :
;
; ***************************************************************************************
Structure udtMyFile
hFile.i
lpReOpenBuff.OFSTRUCT
Eof.i
EndStructure
Global NewList MyFile.udtMyFile()
Global FileLastError
; ***************************************************************************************
Procedure MyIsFile(File)
ForEach MyFile()
If MyFile() = File
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
; ***************************************************************************************
Procedure MyOpenFile(filename.s, uStyle = #OF_READ)
Protected hFile
Protected lpReOpenBuff.OFSTRUCT
Protected result
hFile = OpenFile_(@filename, lpReOpenBuff, uStyle)
If hFile = 0
FileLastError = GetLastError_()
ProcedureReturn 0
Else
result = AddElement(MyFile())
With MyFile()
\hFile = hFile
\lpReOpenBuff = lpReOpenBuff
\Eof = #False
EndWith
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure MyCloseFile(File)
Protected r1
If File
ChangeCurrentElement(MyFile(), File)
r1 = CloseHandle_(MyFile()\hFile)
If r1 = 0
FileLastError = GetLastError_()
EndIf
DeleteElement(MyFile())
EndIf
ProcedureReturn r1
EndProcedure
; ***************************************************************************************
Procedure.q MyLof(File)
Protected result.q
Protected dwError.i
Protected dwSizeLow.l
Protected dwSizeHigh.l
If File = 0
ProcedureReturn -1
EndIf
ChangeCurrentElement(MyFile(), File)
dwSizeLow = GetFileSize_(MyFile()\hFile, @dwSizeHigh)
If dwSizeLow = $FFFFFFFF
dwError = GetLastError_()
If dwError <> #NO_ERROR
FileLastError = dwError
ProcedureReturn -1
EndIf
Else
result = (dwSizeHigh << 32) | dwSizeLow
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure MyEof(*File.udtMyFile)
ProcedureReturn *File\Eof
EndProcedure
; ***************************************************************************************
Procedure.q MySeekFile(File, position.q)
Protected result.q
Protected dwError.i
Protected dwPosLow.l
Protected dwPosHigh.l
If File = 0
ProcedureReturn 0
EndIf
dwPosLow = position & $FFFFFFFF
dwPosHigh = position >> 32
ChangeCurrentElement(MyFile(), File)
dwPosLow = SetFilePointer_(MyFile()\hFile, dwPosLow, @dwPosHigh, #FILE_BEGIN)
If dwPosLow = $FFFFFFFF
dwError = GetLastError_()
If dwError <> #NO_ERROR
FileLastError = dwError
ProcedureReturn -1
EndIf
Else
result = (dwPosHigh << 32) | dwPosLow
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure.s MyReadString(File)
Protected lpBuffer.Character, nNumberOfBytesToRead, lpNumberOfByteRead
Protected r1
Protected result.s
Protected LastChar.c = 0
If File = 0
ProcedureReturn ""
EndIf
ChangeCurrentElement(MyFile(), File)
nNumberOfBytesToRead = 1
result = ""
Repeat
r1 = ReadFile_(MyFile()\hFile, @lpBuffer, nNumberOfBytesToRead, @lpNumberOfByteRead, #Null)
If r1 = 0
Break
Else
If lpNumberOfByteRead = 0
MyFile()\Eof = #True
Break
EndIf
If LastChar = #LF And lpBuffer\c = #CR
Break
ElseIf LastChar = #CR And lpBuffer\c = #LF
Break
ElseIf LastChar = #CR Or LastChar = #LF
SetFilePointer_(MyFile()\hFile, -1, 0, #FILE_CURRENT)
Break
Else
If lpBuffer\c <> #CR And lpBuffer\c <> #LF
result + Chr(lpBuffer\c)
EndIf
EndIf
LastChar = lpBuffer\c
EndIf
ForEver
ProcedureReturn result
EndProcedure
; ***************************************************************************************
; main
a=MyOpenFile("test.txt", uStyle = #OF_SHARE_COMPAT)
s$=MyReadString(a)
Debug Str(a) + " " + s$
Debug MyLof(a)
MySeekFile(a, 7)
s$=MyReadString(a)
Debug "second: " + s$
MyCloseFile(a)
End
Code: Select all
Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long
Code: Select all
;-TOP
; Kommentar :
; Author : mk-soft
; Second Author :
; Datei : files.pb
; Version : 1.02
; Erstellt : 24.02.2010
; Geändert : 28.02.2010
;
; Compilermode :
;
; ***************************************************************************************
;EnableExplicit
Structure udtMyFile
hFile.i
lpReOpenBuff.OFSTRUCT
Eof.i
EndStructure
Global NewList MyFile.udtMyFile()
Global FileLastError
; ***************************************************************************************
Procedure MyIsFile(File)
ForEach MyFile()
If MyFile() = File
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
; ***************************************************************************************
Procedure MyOpenFile(filename.s, uStyle = #OF_READ)
Protected hFile
Protected lpReOpenBuff.OFSTRUCT
Protected result
hFile = OpenFile_(@filename, lpReOpenBuff, uStyle)
If hFile = 0
FileLastError = GetLastError_()
ProcedureReturn 0
Else
Global h = hFile
result = AddElement(MyFile())
With MyFile()
\hFile = hFile
\lpReOpenBuff = lpReOpenBuff
\Eof = #False
EndWith
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure MyCloseFile(File)
Protected r1
If File
ChangeCurrentElement(MyFile(), File)
r1 = CloseHandle_(MyFile()\hFile)
If r1 = 0
FileLastError = GetLastError_()
EndIf
DeleteElement(MyFile())
EndIf
ProcedureReturn r1
EndProcedure
; ***************************************************************************************
Procedure.q MyLof(File)
Protected result.q
Protected dwError.i
Protected dwSizeLow.l
Protected dwSizeHigh.l
If File = 0
ProcedureReturn -1
EndIf
ChangeCurrentElement(MyFile(), File)
dwSizeLow = GetFileSize_(MyFile()\hFile, @dwSizeHigh)
If dwSizeLow = $FFFFFFFF
dwError = GetLastError_()
If dwError <> #NO_ERROR
FileLastError = dwError
ProcedureReturn -1
EndIf
Else
result = (dwSizeHigh << 32) | dwSizeLow
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure MyEof(*File.udtMyFile)
ProcedureReturn *File\Eof
EndProcedure
; ***************************************************************************************
Procedure.q MySeekFile(File, position.q)
Protected result.q
Protected dwError.i
Protected dwPosLow.l
Protected dwPosHigh.l
If File = 0
ProcedureReturn 0
EndIf
dwPosLow = position & $FFFFFFFF
dwPosHigh = position >> 32
ChangeCurrentElement(MyFile(), File)
dwPosLow = SetFilePointer_(MyFile()\hFile, dwPosLow, @dwPosHigh, #FILE_BEGIN)
If dwPosLow = $FFFFFFFF
dwError = GetLastError_()
If dwError <> #NO_ERROR
FileLastError = dwError
ProcedureReturn -1
EndIf
Else
result = (dwPosHigh << 32) | dwPosLow
ProcedureReturn result
EndIf
EndProcedure
; ***************************************************************************************
Procedure.s MyReadString(File)
Protected lpBuffer.Character, nNumberOfBytesToRead, lpNumberOfByteRead
Protected r1
Protected result.s
Protected LastChar.c = 0
If File = 0
ProcedureReturn ""
EndIf
ChangeCurrentElement(MyFile(), File)
nNumberOfBytesToRead = 1
result = ""
Repeat
r1 = ReadFile_(MyFile()\hFile, @lpBuffer, nNumberOfBytesToRead, @lpNumberOfByteRead, #Null)
If r1 = 0
Break
Else
If lpNumberOfByteRead = 0
MyFile()\Eof = #True
Break
EndIf
If LastChar = #LF And lpBuffer\c = #CR
Break
ElseIf LastChar = #CR And lpBuffer\c = #LF
Break
ElseIf LastChar = #CR Or LastChar = #LF
SetFilePointer_(MyFile()\hFile, -1, 0, #FILE_CURRENT)
Break
Else
If lpBuffer\c <> #CR And lpBuffer\c <> #LF
result + Chr(lpBuffer\c)
EndIf
EndIf
LastChar = lpBuffer\c
EndIf
ForEver
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Procedure MyWriteString(File,text$, length)
Protected lpBuffer.s, nNumberOfBytesToWrite
lpBuffer=text$
nNumberOfBytesToWrite=length
ChangeCurrentElement(MyFile(), File)
result = WriteFile_(MyFile()\hFile, @lpBuffer, nNumberOfBytesToWrite, #Null, #Null)
EndProcedure
; ***************************************************************************************
; main
a=MyOpenFile("test.txt", uStyle = #OF_SHARE_COMPAT)
For i= 0 To 2
MySeekFile(a, i*7)
s$=MyReadString(a)
Debug s$
Next
MyCloseFile(a)
a=MyOpenFile("test.txt", uStyle = #OF_SHARE_COMPAT)
t$="XXXXX"
q= MyWriteString(a,t$,3)
MyCloseFile(a)
End
Code: Select all
; ***************************************************************************************
Procedure MyWriteString(File,text$, length)
Protected lpBuffer.s, nNumberOfBytesToWrite,nNumberOfBytesWritten
lpBuffer=text$
nNumberOfBytesToWrite=length
ChangeCurrentElement(MyFile(), File)
result = WriteFile_(MyFile()\hFile, @lpBuffer, nNumberOfBytesToWrite,@nNumberOfBytesWritten, #Null)
; Debug result
EndProcedure
; ***************************************************************************************
; main
a=MyOpenFile("test.txt", uStyle = #OF_SHARE_COMPAT |#OF_READWRITE)
MySeekFile(a,0)
t$="12345"
q= MyWriteString(a,t$,5)
MyCloseFile(a)
End