String in Datei schreiben

Für allgemeine Fragen zur Programmierung mit PureBasic.
pbdau
Beiträge: 9
Registriert: 21.10.2004 11:01
Wohnort: München

String in Datei schreiben

Beitrag von pbdau »

:shock:

Wie kann ich einen String in eine Datei schreiben? Das Skript soll per Zufallsgenerator Zahlen errechnen und dann in eine Datei schreiben.
Welchen Befehl brauche ich, um an die Datei wieder einen String anzuhängen? Die Datei soll sich so auf ca. 100 MB aufblähen. Gedacht, um den freien Bereich der HD mit Müll vollzuschreiben um gelöschte Dateien zu überschreiben.

Code: Alles auswählen

For Schleife0 = 1 To 32766
  ZUFALL0 = Random(9)
  ZUFALL0a$ = Str(ZUFALL0)
  string0$ = ZUFALL0a$+string0$
Next
CreateFile(#PB_Any,"c:\muell.txt")
OpenFile(#PB_Any,"C:\muell.txt")
WriteString(string0$)
CloseFile(#PB_Any)
Input()
Bei WriteString kommt eine Fehlermeldung.

edit redacid: code-tags gesetzt.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Da nimm doch lieber SafeErase, ist freeware, und entsorgt zu löschende Dateien 99% sicher. (mit höchster Sicherheitsstufe überschreibt es die Daten 27 mal mit Zufallswerten und co. Da findet kein Recoverytool mehr was. ;))

Ansonsten, wenn es umbedingt ein eigenes Programm sein soll, createfile() offnet bereits die Datei, es wird kein openfile mehr benötigt.
und #PB_Any in dieser Verbindung dürfte so imo nicht klappen, da er ja nicht weiß, ich welche Datei er den String schreiben soll. Versuch es mal so:
Wichtig: Die Datei müsste ca. 100 MB groß werden, wenn ich mich nicht verrechnet habe...

Code: Alles auswählen

CreateFile(0,"c:\muell.txt")
  For Schleife0 = 1 To 104857600
    WriteString(Str(Random(9)))
  Next
CloseFile(0)
Ach ja, 100 MB, das ist ne verdammt große Menge! Und wie löschst du dann diese Dateien sicher ohne fragmente zu hinterlassen welche die Festplatte übrigends sehr langsam machen?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich würde das ganze so machen.

Code: Alles auswählen

Size = 100 * 1024 * 1024
File.s = "J:\Vollschreibdatei.dat"

*Mem = AllocateMemory(Size)

If *Mem
  *p.LONG = *Mem
  *pEnd = *Mem + Size - 1
  
  While *p < *pEnd
    *p\l = Random($FFFF) << 16 + Random($FFFF)
    *p + 4
  Wend
  
  FileID = CreateFile(#PB_Any, File)
  If FileID
    WriteData(*Mem, Size)
    CloseFile(FileID)
  EndIf
  FreeMemory(*Mem)
EndIf
Das setzt natürlich die gleiche Menge Arbeitsspeicher vorraus wie die Datei groß sein soll.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Naja, Nic's Variante ist mit Sicherheit die schnellere, um mehr als das hundertfache sicher. Allerdings glaube ich nicht, dass pbdau damit etwas anfangen kann. Das sind dann doch etwas zu viele Pointer und Berechnungen. Und der Fehler lag ja nun daran, dass er die #PB_Any Konstante verwendet hatte, welche man in seinem Fall aber nicht nehmen dürfte.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Vielleicht ist NTQ ja schneller.
Habe es etwas anders gemacht. Bei jedem Start wird das Zufallsprodukt
angehängt. :mrgreen:

MfG Falko

Code: Alles auswählen

Procedure PB_Append()
 FileSeek(Lof());
EndProcedure

Datei$="TestAnhang.txt"

OpenFile(0,Datei$)
PB_Append()
For Schleife0 = 1 To 32766 
  ZUFALL0 = Random(9) 
  ZUFALL0a$ = Str(ZUFALL0) 
  string0$ = ZUFALL0a$+string0$ 
Next 
WriteString(string0$)
CloseFile(0)
Bild
Win11 Pro 64-Bit, PB_6.11b1
pbdau
Beiträge: 9
Registriert: 21.10.2004 11:01
Wohnort: München

Danke

Beitrag von pbdau »

vielen vielen Dank, auch wenn ich (leider) die ganzen Hilfen noch nicht verstehe. Aber nach dem Entfernen von #PB_Any (für was auch immer das gut sein mag...) funzt es jetzt wenigstens.
Der tiefere Sinn des Tools (wenn es irgendwann mal fertig ist, soll sein, die freien Bereiche der Festplatte vollständig mit Müll zu beschreiben und danach den Müll wieder zu löschen. Die Dateien sollten möglichst gross sein, damit im Filesystem möglichst wenig Einträge sind. Da man nie weiss, wo Windoof seine Dateien ablegt, ist das die schnellste und sicherste Art, sämtliche Dateien zu überschreiben. Dadurch, dass nicht lauter einheitliche Zeichen (0,1 o.ä.) auf der Festplatte sind, dürfte das Problem des Restmagnetismus der alten Datei erheblich schwerer zu knacken sein. Ist sinnvoll, wenn man eine alte Festplatte mit geheimen Daten verschenken will o.ä.

PS: Wie heisst der Befehl, um eine Zahl in ASCII-Code umzuwandeln, d.h. aus 92 soll \ werden?
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

Debug Chr(92)
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Beitrag von Sylvia »

@Nic:
Welchen Lehrer hast du gehabt ? So einen Crypt-Code abzuliefern...ist ja
richtig ekelhaft! Meinst du das bringt einem Anfänger was ?

Deine Hilfsbereitschaft in Ehren, aber bitte...etwas mehr Transparenz !
Basic Pur = PureBasic
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Sylvia:
Tja, ich hatte eben keinen Lehrer.
Außerdem ist das kein Crypt-Code, denn jeder der PB ein bisschen kennt, wird sich damit direkt zurechtfinden.

Klar muss ich gestehen, dass ich nicht daran gedacht hatte, dass der Threadstarter sich noch so gut wie gar nicht mit PB auskennt.
Benutzeravatar
Rob
Shadow Admin
Beiträge: 258
Registriert: 26.08.2004 01:39
Kontaktdaten:

Beitrag von Rob »

Der Code ist doch ok. Was fehlt sind Kommentare...
Build a man a fire and he's warm for a day. Set a man on fire and he's warm for the rest of his life
Antworten