CloseFile+DeleteFile

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

CloseFile+DeleteFile

Beitrag 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
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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 :allright:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Erstmal:

Code: Alles auswählen

if CreateFile(123,"temp.pls")
  WriteString(Playlist)
  CloseFile(123)
endif
Dann: Vielleicht hilft ein:

Code: Alles auswählen

 Delay(1)
oder

Code: Alles auswählen

While windowevent():wend
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag 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.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag 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
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Werd ich mal testen :) THX :allright:
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

bei deinen Funktionen was muss ich bei CreateFile als ApiFilehandle übergeben? da habbich doch noch garkein handle? *verwirrt bin*
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag 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) :)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag 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
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag von redacid »

125: bitte benutze in Zukunft die Edit-Funktion, anstatt 3 Beiträge hintereinander zu posten!
Antworten