Seite 1 von 3

WriteData

Verfasst: 14.07.2011 10:53
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é

Re: WriteData

Verfasst: 14.07.2011 12:10
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...

Re: WriteData

Verfasst: 14.07.2011 12:24
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?

Re: WriteData

Verfasst: 14.07.2011 12:46
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é

Re: WriteData

Verfasst: 14.07.2011 16:01
von Zaphod
Was HeXOR meint ist, dass es nicht möglich ist aus dem Code den du gepostet hast den Fehler zu finden.

Re: WriteData

Verfasst: 14.07.2011 17:03
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é

Re: WriteData

Verfasst: 14.07.2011 17:12
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.

Re: WriteData

Verfasst: 14.07.2011 17:22
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é

Re: WriteData

Verfasst: 14.07.2011 17:48
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.

Re: WriteData

Verfasst: 14.07.2011 18:00
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é