WriteData

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

WriteData

Beitrag von Elektrolurch »

Hallo

ich habe einmal wieder eine Frage, die mich zur Verzweiflung bringt.
Ich erweitere ein altes Programm mal wieder um eine Funktion.
Ich lese eine Datei in den Speicher und ersetze eine Zeichenkette gegen eine neu. (Patch)
Soweit klappt auch alles.
Nur wenn ich versuche den Speicherinhalt wieder in eine Datei zu speichern kommt mein Problem.

Code: Alles auswählen

    If CreateFile(0, Ziel.s + "Datei")
      WriteData(0, *Dateiinhalt, 2000)
      CloseFile(0)
    Else
      Debug "Fehler"
    EndIf
Diese Zeilen funktionieren und ich habe eine Datei mit den ersten 2000 Zeichen.

Code: Alles auswählen

    If CreateFile(0, Ziel.s + "Datei")
       WriteData(0, *Dateiinhalt , Dateilaenge.l)
      CloseFile(0)
    Else
      Debug "Fehler"
    EndIf
Nach diesen Zeilen habe ich zwar eine Datei mit der Länge der Ursprungsdatei, jedoch stehen nur NUL darin.
Kann mir jemand erklären wo mein Fehler liegt.

Nachtrag:
Ich habe nun noch eine dritte Variante probiert.

Code: Alles auswählen

  If CreateFile(0, Ziel.s + "Datei")
    For I = 0 To Dateilaenge.l
      WriteData(0, *Dateiinhalt + I, 1)
    Next I  
    CloseFile(0)
  Else
    Debug "Fehler"
  EndIf
Die nun erstellte Datei beginnt zwar richtig, hat aber lediglich 8190 Zeichen, obwohl die Dateilänge eigentlich 4069386 Zeichen ist.

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: WriteData

Beitrag von HeX0R »

Komm schon, das bekommst du bestimmt besser hin.

Ich werfe einem Mechaniker auch nicht ein paar Schrauben hin und sage er soll einen BMW draus bauen...
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: WriteData

Beitrag von 7x7 »

Syntax

Ergebnis = CreateFile(#Datei, DateiName$)
Beschreibung

Öffnet eine leere Datei. Existierte die angegebene Datei bereits, wird diese geöffnet und mit einem leeren Inhalt ersetzt! Seien Sie vorsichtig!
Liegt's daran?
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: WriteData

Beitrag von Elektrolurch »

Hi

Wie meinst du dass?
Möchtest du mehr Code?

Es ist schlecht was Eigenständig lauffähiges aus meinem Progamm herauszutrennen.
Aber ich glaube ich komme meinem Fehler auf die Schliche.
Ich schreibe nämlich meine Datei über das Netzwerk auf eine Linuxfreigabe.
Ich habe gerade eben auf mein lokales Laufwerk geschrieben und da hörten die Datei nicht nach 8190 Zeichen auf

Code: Alles auswählen

  If CreateFile(0, "h:\Datei")
    For I = 0 To Dateilaenge.l
      WriteData(0, *Dateiinhalt + I, 1)
      ;Debug I
    Next I  
    CloseFile(0)
  Else
    Debug "Fehler"
  EndIf
Sie war eher ein Zeichen zu lange, aber das liegt wohl an der For Next Schleife.

@ 7x7
Ich glaube, nicht da die Datei ja nicht immer leer ist, außerdem erhält sie momentan ja einen anderen Namen wie die Quelldatei, ergo existiert sie ja nicht.
BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Re: WriteData

Beitrag von Zaphod »

Was HeXOR meint ist, dass es nicht möglich ist aus dem Code den du gepostet hast den Fehler zu finden.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: WriteData

Beitrag von Elektrolurch »

Hi

ich habs mir ja schon fast gedacht. :oops:
Ich habe jetzt mal das wichtigste herausgeschnitten und zusammengestrichen, dass es lauffähig ist.
Ich denke aber nicht, dass es mehr verwertbare Informationen hat als zuvor.
Aber sei's drum.
Das Problem scheint der Ort zu sein, auf den ich zu speichern versuche.
Ich kann zwar jetzt die Datei im Ordner des Programms speichern und anschließend das File verschieben, aber meine Frage bleibt. :cry:
Hier der Code

Code: Alles auswählen

;Einlesen
Dateilaenge.l = FileSize("\\192.168.1.7\import\A")
*Dateiinhalt  = AllocateMemory(Dateilaenge.l)
If ReadFile(0, "\\192.168.1.7\import\A")
  ReadData(0, *Dateiinhalt, Dateilaenge.l)
  CloseFile(0)
Else
  Debug "Fehler beim einlesen"
EndIf
;Kontrollieren ob schon gepatched
For I = 0 To  Dateilaenge.l
  If PeekS( *Dateiinhalt + I, 10) = "Alter Text"
    Debug "Ist schon gepatched"
    End
  EndIf
Next I
;Patchen
For I = 0 To  Dateilaenge.l
  If PeekS( *Dateiinhalt + I, 10) = "Alter Text"
    PokeS(*Dateiinhalt + I, "Neuer Text" , 10)
    Debug "Jetzt gepatched"
  EndIf
Next I
;Dieses Speichern geht
If CreateFile(0, "h:\B")
  WriteData(0, *Dateiinhalt, Dateilaenge.l)
  CloseFile(0)
Else
  Debug "Fehler"
EndIf
;Dieses Speichern geht nicht
If CreateFile(0, "\\192.168.1.7\import\B")
  WriteData(0, *Dateiinhalt, Dateilaenge.l)
  CloseFile(0)
Else
  Debug "Fehler"
EndIf
BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: WriteData

Beitrag von STARGÅTE »

Meiner Meinung nach hast du einfach keine Rechte auf dem NetzwerkPfad etwas zu erstellen/schreiben.

PS: ich hoffe dein Code sieht nicht wirklich so aus.
denn:
PokeS(*Dateiinhalt + I, "Neuer Text" , 10)
schreibt immer noch n NULL ans Ende und vernichtet somit u.u. nachfolgende Daten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: WriteData

Beitrag von Elektrolurch »

Hi Stargate

Doch die Rechte habe ich ich kann ja je nach Versuch Dateien mit verschiedenen Inhalten erzeugen oder am Ende die fertige Datei dorthin kopieren.
Der Ordner hat volle Freigabe zum lesen und schreiben für alle!

Leider sieht mein Code Tatsächlich so aus. :oops:
Das mit dem nachgestellten NUL habe ich nicht gemerkt da die nächsten Stellen sowieso NUL sind.
Aber wenn wir schon dabei sind, wie mache ich es denn richtig?
Ich lerne gerne etwas dazu, wenn ich auch zugeben muß, mit dem behalten wird es immer schwieriger. :lol:

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
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: WriteData

Beitrag von ts-soft »

Es kann IMHO nur an den fehlenden Rechten liegen, ich hab Deine Speichern Routine mal für mich zum Testen
angepasst und es geht einwandfrei.

Code: Alles auswählen

Define.s Text = "Holla, der Rucksack brennt"

If CreateFile(0, "\\192.168.1.100\shared\B")
  WriteData(0, @Text, Len(Text))
  CloseFile(0)
Else
  Debug "Kein schreiben möglich"
EndIf
Ansonsten bleiben noch Security-Tools, die blockieren oder keine Netzwerkverbindung übrig.
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
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: WriteData

Beitrag von Elektrolurch »

Hi ts-soft

Ich habe gerade einmal ausprobiert, was Stargate mir zeigte.
Ich habe mir eine kleine Textdatei erstellte und den Text wie besschrieben geändert.
Siehe da Stargate hat tatsächlich Recht, an der Stelle nach dem Einfügen steht ein NUL.

Was aber für micht interessanter ist, ist dass beide gespeichert Versionen identisch sind.
Also bei kleinen Dateien funktionien beide Speicherorte.

Das Programm das ich patchen muß hat aber 3,88 MB und dann kommen auf einmal die Probleme.

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Antworten