Seite 1 von 3

CreateFile (überschreibt Datei nicht !)

Verfasst: 05.05.2014 20:02
von Simon74
Hallo,

lauf Hilfe wird mit CreateFile die Datei überschrieben (hätte ich auch gerne),
jedoch wird bei erneutem Procedureaufruf, der Text appended ?

Stimmt die Hilfe nicht oder meine Prozedur ?

Code: Alles auswählen

Procedure CreateMETA()
  If File$
    Protected.s MetaFile$
    Protected.s Text_Channel$ = GetGadgetText(Text_Channel)
    OpenServiceReference()
    MetaFile$ = ReplaceString(File$,".txt","")
    If GetGadgetState(400) = #PB_Checkbox_Unchecked
      MetaFile$ = SaveFileRequester("META speichern unter ...", MetaFile$+".meta", "meta (*.meta)|*.meta", 1)
    Else
      MetaFile$ = MetaFile$ + ".meta"
    EndIf 
    If MetaFile$
      If CreateFile(1,MetaFile$)
        ;Liste durchsuchen
        ForEach SRList()
          If SRList()\Channel = Text_Channel$
            WriteStringN(1, (SRList()\Service))
            WriteStringN(1, GetGadgetText(Text_Title))
            WriteStringN(1, GetGadgetText(Text_Genre))
            WriteStringN(1, Str(UnixTime()))
          EndIf
        Next
        CloseFile(1)  
      EndIf
    EndIf
  EndIf 
EndProcedure

Re: CreateFile (überschreibt Datei nicht ?)

Verfasst: 05.05.2014 20:10
von Kiffi
mach mal eine entsprechende Debug-Ausgabe:

Code: Alles auswählen

Procedure CreateMETA()
    [...]
    If MetaFile$
      If CreateFile(1,MetaFile$)
        Debug "CreateFile hat geklappt!"
        ;Liste durchsuchen
        ForEach SRList()
         [...]
"CreateFile hat geklappt!" wird ausgegeben?

Grüße ... Kiffi

Re: CreateFile (überschreibt Datei nicht ?)

Verfasst: 05.05.2014 21:05
von Simon74
Ja klar, geht.
Wenn Datei existiert und nicht existiert,
jedoch wenn existiert wird appended und keine neue erstellt.

Wenn ich Programm neu starte wird überschrieben,
jedoch nicht bei erneutem Proceduraufruf.

Verstehe ich jedoch nicht, da ich ja am Ende der Procedur das File schliesse !?
Sieht für mich so aus das er dies eben NICHT schliesst, wieso ist mir nicht klar, da ja ein

Code: Alles auswählen

CloseFile
da ist.

Habe CloseFile auch schon weiter nach hinten gesetzt, bringt aber nichts.

Re: CreateFile (überschreibt Datei nicht ?)

Verfasst: 05.05.2014 21:17
von Kiffi
das einzige, was ich mir noch vorstellen könnte: Deine SRList() enthält bei jedem weiteren Aufruf das n-fache an Daten, so dass Du beim ersten Aufruf den Datensatz einmal schreibst und bei jedem erneuten Aufruf das entsprechend vielfache schreibst.

CreateFile() ist eigentlich sehr robust; daran sollte es nicht liegen. Deswegen auch erstmal mein Hinweis zur Kontrolle, ob diese Stelle überhaupt angesprungen wird.

Grüße ... Kiffi

Re: CreateFile (überschreibt Datei nicht ?)

Verfasst: 05.05.2014 21:23
von Simon74
Der Satz wird nur einmal geschrieben (also jeweils die 4 Zeilen).
Hab jedoch noch folgendes gestestet.

1. Programm starten, Procedure-Aufruf
2. ohne schliessen des Programms die geschriebene Datei per Windows Explorer gelöscht (funktioniert).
3. Procedure-Aufruf, Datei wird neu erstellt

Sollte also doch heissen das "CloseFile" funktioniert.
Also doch ein Problem von "CreateFile" ?
Natürlich kann ich ein DeleteFile machen finde ich jedoch unschön, weil es nicht nötig sein sollte.. ?

Re: CreateFile (überschreibt Datei nicht ?)

Verfasst: 05.05.2014 21:37
von Simon74
Versteh nun gar nix mehr, nicht mal ein "DelteFile" hilft.

Habe testweise ein DeleteFile direkt vor CreateFile eingebaut,
bei wiederholtem Procedure-Aufruf wird trotzdem appended !?!
>_<

Re: CreateFile (überschreibt Datei nicht !)

Verfasst: 05.05.2014 21:54
von ts-soft
Schreibst Du in ein Verzeichnis, wo Du auch die Rechte zum schreiben hast?
Ansonsten, bei falscher Manifest, kann sein das Windows Deine Ausgabe nach
virtual Store umleitet.
Schalte mal in den CompilerOptionen die unterste Checkbox ein:
User-Modus für Windows Vista und höher anfordern (keine Virtualisierung).

Danach nochmals testen, mit den von Kiffi aufgezeigten Debugs.

Sollte auch dies nicht das Problem sein, wird ein vollständiger, ausführbare Code
benötigt, mit Beschreibung von CompilerOptionen, PB-Version, OS, Pfaden usw.

Gruß
Thomas

Re: CreateFile (überschreibt Datei nicht !)

Verfasst: 05.05.2014 22:01
von Derren
War da nicht mal was mit ausführbarem Code?

Code: Alles auswählen

Procedure CreateMETA()

    Protected.s MetaFile$
    
    
      MetaFile$ = SaveFileRequester("META speichern unter ...", MetaFile$+".txt", "txt (*.txt)|*.txt", 1)
      If MetaFile$ = ""
      	ProcedureReturn #False
      EndIf 


      If CreateFile(1,MetaFile$)      
          
            WriteStringN(1, "Service")
            WriteStringN(1, "Title")
            WriteStringN(1, "Genre")
            WriteStringN(1, Str(Random(9999)))         
       
        CloseFile(1) 
      EndIf


  EndProcedure
  
  
  CreateMeta()
  Delay(2000)  
  CreateMeta()
Das funktioniert einwandfrei. Immer 5 Zeilen, da die Datei immer neu angelegt wird.


@ts-soft: Wenn das Programm keine Schreibrechte hat sollte CreateFile() doch fehlschlagen und nicht einfach mit OpenFile() und dann auch noch FileSeek(FileSize()) hinterher ersetzt werden.

Selbst mit OpenFile() wird der Inhalt überschrieben, weil der Zeiger am Anfang der Datei sitzt. Da wird nichts hinten angehängt.

Re: CreateFile (überschreibt Datei nicht !)

Verfasst: 05.05.2014 22:09
von ts-soft
Derren hat geschrieben: @ts-soft: Wenn das Programm keine Schreibrechte hat sollte CreateFile() doch fehlschlagen und nicht einfach mit OpenFile() und dann auch noch FileSeek(FileSize()) hinterher ersetzt werden.
Sollte! Es genügt schon, das ausführende Programm "Install.exe" zu nennen, und Windows fordert
Adminrechte an, um XP-Kompatible zu sein :mrgreen:

Ohne passende Manifest kann man sich nicht umbedingt auf die Ergebnisse, die PB bzw. die API zurückgibt,
verlassen! In meinen Einstellungen fordere ich den User-Modus per Default an.


Letze Möglichkeit, die mir noch einfällt, er nutzt Threads.

Re: CreateFile (überschreibt Datei nicht !)

Verfasst: 05.05.2014 22:11
von Simon74
Ich denke ich habe das Problem festgestellt,
das Problem liegt in der ForEach Schleife nach CreateFile..
Wenn ich diese rausnehme funktionierts.
Muss jetzt nur noch feststellen wieso :mrgreen: