CreateFile (überschreibt Datei nicht !)

Anfängerfragen zum Programmieren mit PureBasic.
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

CreateFile (überschreibt Datei nicht !)

Beitrag 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
Zuletzt geändert von Simon74 am 05.05.2014 21:48, insgesamt 2-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CreateFile (überschreibt Datei nicht ?)

Beitrag 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
a²+b²=mc²
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: CreateFile (überschreibt Datei nicht ?)

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CreateFile (überschreibt Datei nicht ?)

Beitrag 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
a²+b²=mc²
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: CreateFile (überschreibt Datei nicht ?)

Beitrag 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.. ?
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: CreateFile (überschreibt Datei nicht ?)

Beitrag 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 !?!
>_<
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CreateFile (überschreibt Datei nicht !)

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: CreateFile (überschreibt Datei nicht !)

Beitrag 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.
Signatur und so
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CreateFile (überschreibt Datei nicht !)

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Simon74
Beiträge: 60
Registriert: 04.05.2014 10:05

Re: CreateFile (überschreibt Datei nicht !)

Beitrag 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:
Antworten