Seite 1 von 2
CloseFile+DeleteFile
Verfasst: 29.12.2004 20:43
von 125
hi,
windows hat ja nen FileLock=nur nich geöffnete dateien können gelöscht werden. Nun hab ich in meinem Programm das hier:
Code: Alles auswählen
DeleteFile("temp.pls")
CreateFile(123,"temp.pls")
WriteString(Playlist)
CloseFile(123)
LoadPL(0,"temp.pls")
Das muss ich manchmal mehrmals ausführen. aber sobald das erste mal CreateFile(123,"temp.pls") ausgeführt wurde funzt DeleteFile("temp.pls") nicht mehr obwohl ich CloseFile(123) nutze.
Woran kann das liegen?
Pls Help
mfg
125
Verfasst: 29.12.2004 20:51
von Lukaso
Hallo,
dieses Problem habe ich auch in meinem 40-Pix-Player, auch wenn ich die Datei per FMOD schließe, kann ich die Datei weder verschieben noch Löschen, erst nachdem ich das Programm beendet habe.
Ne lösung würde auch mir helfen!
Dnake

Verfasst: 29.12.2004 22:54
von GPI
Erstmal:
Code: Alles auswählen
if CreateFile(123,"temp.pls")
WriteString(Playlist)
CloseFile(123)
endif
Dann: Vielleicht hilft ein:
oder
Verfasst: 29.12.2004 23:03
von 125
Ne,
hilft nix hast mich auch Falsch verstanden. bis zum nächsten Funktions aufruf können ohne Probs mehr als 3 Minuten vergehen. Aber die Datei ist erst nach dem beenden des programms deletbar. Der Filelock bliebt obwohl CloseFile() aufgerufen wurde bestehen.
Verfasst: 29.12.2004 23:10
von GPI
Fred in englischen Forum zeigen, ist dann ein bug...
Ich nehm meistens meine Routinen, da a) gebuffert, b) ich ohne probleme mehrere Dateien gleichzeitig offen haben kann, ohne das ich mit usefile() dauernt hin und her switchen muß.
Code: Alles auswählen
;info: Create and Read file with API
;Use PB-Memory
Structure API_FileHandle
FHandle.l
Buffer.l
BufferLen.l
ReadPos.l
DataInBuffer.l
readed.l
EndStructure
Procedure API_LOF(*File.API_FileHandle)
ProcedureReturn GetFileSize_(*File\FHandle,0)
EndProcedure
Procedure API_CloseFile(*File.API_FileHandle)
If *File\FHandle<>#INVALID_HANDLE_VALUE
CloseHandle_(*File\FHandle)
EndIf
If *File\Buffer
FreeMemory(*File\Buffer):*File\Buffer=0
EndIf
EndProcedure
Procedure API_FileReadEX(*File.API_FileHandle,File$,BufferLen)
*File\FHandle=CreateFile_(File$,#GENERIC_READ,#FILE_SHARE_READ,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)
If *File\FHandle=#INVALID_HANDLE_VALUE
ProcedureReturn #False
Else
*File\BufferLen=BufferLen
*File\Buffer=AllocateMemory(*File\BufferLen)
*File\ReadPos=*File\Buffer
*File\DataInBuffer=0
ProcedureReturn #True
EndIf
EndProcedure
Procedure API_FileRead(*File.API_FileHandle,File$)
ProcedureReturn API_FileReadEX(*File,File$,1024*4)
EndProcedure
Procedure API_ReadData(*File.API_FileHandle,*Buffer,len)
Result=0
If *File\DataInBuffer>=len
CopyMemory(*File\ReadPos,*Buffer,len)
*File\DataInBuffer-len
If *File\DataInBuffer
*File\ReadPos+len
Else
*File\ReadPos=*File\Buffer
EndIf
Result=len
Else
If *File\DataInBuffer>0
CopyMemory(*File\ReadPos,*Buffer,*File\DataInBuffer)
*Buffer+*File\DataInBuffer
Result=*File\DataInBuffer
len-*File\DataInBuffer
*File\DataInBuffer=0
*File\ReadPos=*File\Buffer
EndIf
If ReadFile_(*File\FHandle,*Buffer,len,@readed,0)<>0
Result+readed
*File\readed+readed
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure API_CurrentPos(*File.API_FileHandle)
ProcedureReturn *File\readed-*File\DataInBuffer
EndProcedure
Procedure API_ReadByte(*File.API_FileHandle)
If *File\DataInBuffer=0
If ReadFile_(*File\FHandle,*File\Buffer,*File\BufferLen,@readed,0)<>0
*File\readed+readed
*File\DataInBuffer=readed
*File\ReadPos=*File\Buffer
EndIf
EndIf
If *File\DataInBuffer
Result=PeekB(*File\ReadPos) &$FF : *File\ReadPos+1:*File\DataInBuffer-1
Else
Result=-1
EndIf
ProcedureReturn Result
EndProcedure
Procedure API_PushBackByte(*File.API_FileHandle)
If *File\ReadPos>*File\Buffer
*File\ReadPos-1:*File\DataInBuffer+1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure API_EOF(*File.API_FileHandle)
If API_ReadByte(*File)=-1
ProcedureReturn #True
Else
API_PushBackByte(*File)
ProcedureReturn #False
EndIf
EndProcedure
Procedure.s API_ReadString(*File.API_FileHandle)
a$=""
ende=#False
Repeat
byte=API_ReadByte(*File)
Select byte
Case 0:ende=#True
Case 10:ende=#True:byte=API_ReadByte(*File):If byte<>13 And byte<>10 And byte<>0 And byte<>-1: API_PushBackByte(*File) :EndIf
Case 13:ende=#True:byte=API_ReadByte(*File):If byte<>13 And byte<>10 And byte<>0 And byte<>-1: API_PushBackByte(*File) :EndIf
Case -1:ende=#True
Default
a$+Chr(byte)
EndSelect
Until ende
ProcedureReturn a$
EndProcedure
Procedure API_FileCreate(*File.API_FileHandle,File$)
*File\FHandle=CreateFile_(File$,#GENERIC_WRITE ,0,0,#CREATE_ALWAYS ,#FILE_ATTRIBUTE_NORMAL,0)
If *File\FHandle=#INVALID_HANDLE_VALUE
ProcedureReturn #False
Else
ProcedureReturn #True
EndIf
EndProcedure
Procedure API_WriteData(*File.API_FileHandle,*Buffer,len)
If WriteFile_(*File\FHandle,*Buffer,len,@written,0)
ProcedureReturn written
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure API_WriteString(*File.API_FileHandle,a$)
ProcedureReturn API_WriteData(*File,@a$,Len(a$))
EndProcedure
Procedure API_WriteStringN(*File.API_FileHandle,a$)
a$+Chr(13)+Chr(10)
ProcedureReturn API_WriteData(*File,@a$,Len(a$))
EndProcedure
; FHandle.API_FileHandle
; File$="Hallo.txt"
; random$=Str(Random(1000))
; Debug "random:"+random$
; If API_FileCreate(FHandle,File$)
; API_WriteString(FHandle,"Test ")
; API_WriteStringN(FHandle,"Hallo")
; API_WriteStringN(FHandle,"Zeile 2")
; API_WriteStringN(FHandle,"Zeile 3")
; API_WriteStringN(FHandle,random$)
; API_CloseFile(FHandle)
; EndIf
; Debug "---"
; If API_FileRead(FHandle,File$)
; While API_EOF(FHandle)=#False
; Debug API_ReadString(FHandle)
; Wend
; API_CloseFile(FHandle)
; EndIf
Verfasst: 29.12.2004 23:13
von 125
Werd ich mal testen

THX

Verfasst: 29.12.2004 23:35
von 125
bei deinen Funktionen was muss ich bei CreateFile als ApiFilehandle übergeben? da habbich doch noch garkein handle? *verwirrt bin*
Verfasst: 30.12.2004 01:40
von 125
habs nun anders gelöst
ich nenne meine temps jetzt immer
"temp"+str(a)+"fileendung"
a+1
so kann keine datei bei einem programmstart zweimal vorkommen und wenn sie schon vorhanden ist vom letzten progstart wird sie gelöscht (was dann ja geht)

Verfasst: 30.12.2004 18:44
von GPI
125 hat geschrieben:bei deinen Funktionen was muss ich bei CreateFile als ApiFilehandle übergeben? da habbich doch noch garkein handle? *verwirrt bin*
nein, du übergibts eine Variable, wo das Handle abgespeichert wird.
Code: Alles auswählen
FHandle.API_FileHandle
File$="Hallo.txt"
random$=Str(Random(1000))
Debug "random:"+random$
If API_FileCreate(FHandle,File$)
API_WriteString(FHandle,"Test ")
API_WriteStringN(FHandle,"Hallo")
API_WriteStringN(FHandle,"Zeile 2")
API_WriteStringN(FHandle,"Zeile 3")
API_WriteStringN(FHandle,random$)
API_CloseFile(FHandle)
EndIf
Debug "---"
If API_FileRead(FHandle,File$)
While API_EOF(FHandle)=#False
Debug API_ReadString(FHandle)
Wend
API_CloseFile(FHandle)
EndIf
Verfasst: 31.12.2004 12:12
von redacid
125: bitte benutze in Zukunft die Edit-Funktion, anstatt 3 Beiträge hintereinander zu posten!