PDA

Ver la Versión Completa : Problema con TFileStream


pelaorb68
18-10-2006, 19:02:53
Hola a todos nuevamente, estoy intentando utilizar TFileStream, pero no logro enterder su funcionamiento, por lo tanto no sé si es lo que necesito o estoy haciendo algo mal con él.
Resulta que quiero grabar unas cadenas de caracteres en archivo, pero que al editar el archivo sean caracteres ilegibles. Para ello estoy probando TFileStream. Según el código siguiente, FilesStream hace lo que necesito:


var
fOut : TFileStream;
sLine: string;
begin
sLine := 'Esta en una linea de Prueba con FileStream';
fOut := TFileStream.Create(cFileName,fmCreate);
fOut.Write(sLine,Length(sLine));
fOut.Free;
end;


El punto es cómo hago ahora para leer el archivo recién creado y recuperar la información como la cadena string original?????

Desde ya muchas gracias por la ayuda que me puedan brindar.......

maeyanes
18-10-2006, 19:08:16
Me imagino que sería algo parecido:


var
fIn: TFileStream;
sLine: array [0..255] of Char;

begin
fIn := TFileStream.Create(cFileName, fmOpenRead);
try
fIn.Read(sLine, 100); // Lee 100 bytes del archivo...
finally
fIn.Free
end
end;



Saludos...

seoane
18-10-2006, 19:15:51
Vamos a ver, para grabar un string debes de hacer algo como esto:


var
fOut : TFileStream;
sLine: string;
begin
sLine := 'Esta en una linea de Prueba con FileStream';
fOut := TFileStream.Create(cFileName,fmCreate);
fOut.Write(PChar(sLine)^,Length(sLine)); // <--
fOut.Free;
end;


Piensa que tal como lo tenias antes lo que mandabas escribir no era el contenido del string, si no la propia variable string que no es mas que un puntero.

pelaorb68
18-10-2006, 19:21:03
Lo que pasa es que cuando hago el Write con Pointer, me graba la cadena tal cual como es, es decir, si alguien editara el archivo leería la cadena sin ningún problema.

seoane
18-10-2006, 19:24:02
Lo que pasa es que cuando hago el Write con Pointer, me graba la cadena tal cual como es, es decir, si alguien editara el archivo leería la cadena sin ningún problema.

Y si lo haces de la otra manera lo que estas grabando es basura que se encuentra en memoria, esa información de poco te va a servir. Lo que tu necesitas es cifrar el texto antes de guardarlo.

pelaorb68
18-10-2006, 19:29:50
Entiendo perfectamente, lo que ahora no logro entender es que sentido tiene el FileStream......cuando hace casi lo mismo que TextFile......

Voy a intentar cifrar el texto antes de grabar........

Muchísimas gracias por sus prontas respuestas......

seoane
18-10-2006, 19:49:41
Los stream son herramientas muy potentes, cuando trabajes un poco mas con ellos te darás cuenta ;) . En cuanto a lo de cifrar el texto, dependiendo de la seguridad que necesites, puedes usar trucos sencillos como este http://www.clubdelphi.com/trucos/index.php?id=53 o incluso como este, que todavía es mas sencillo y evita ciertos problemas con el random al trabajar en diferentes compiladores:


function Cifrar(Texto: string; Clave: Byte): string;
var
i: integer;
begin
Result:= '';
for i:= 1 to Length(Texto) do
Result:= Result + IntToHex(Byte(Texto[ i ]) xor Clave,2);
end;

function Descifrar(Texto: string; Clave: Longint): string;
var
i: integer;
begin
Result:= '';
while Length(Texto) > 0 do
begin
if not TryStrToInt('$'+Copy(Texto,1,2),i) then
begin
Result:= '';
Exit;
end;
Result:= Result + Char(Byte(i) xor Clave);
Delete(Texto,1,2);
end;
end;


Si lo que necesitas es SEGURIDAD con mayúsculas, te sugiero utilices algún algoritmo de cifrado algo mas fuerte: AES, Serpent, etc ... Existen componentes para realizar ese tipo de cifrados. Si buscas en los foros encontraras información sobre alguno

dec
18-10-2006, 20:09:14
Hola,

Disculpad si digo algo que verdaderamente sea absurdo, pero, ¿cómo es que yo recuerdo haber leído en algún libro (creo que sobre el lenguaje C), incluso en el que venían ejemplos, acerca de escribir en un archivo de texto los caracteres que fueran menester pero en (aquí el posible absurdo) binario, de tal modo que en realidad los caracteres fueran "ilegibles", salvo cuando los leíamos de nuevo nosotros, claro?

Es que intuyo que el compañero iba por ahí... no tanto por cifrar el contenido del archivo, que son dos cosas distintas, si es que esta que comento tiene razón de ser. Pero, ¡yo recuerdo haberlo leído! Una pena que no recuerde mucho más que eso...

No se me escapa que pueden escribirse "records" en un archivo de manera que los datos que se vean en el mismo sean un conglomerado de caracteres sin sentido aparente, pero, yo me estoy refiriendo (y creo que el compañero también) a hacerlo, digamos, directamente, sin "records", sino con funciones de "entrada/salida" para tal menester.

¿Qué decís vuestras mercedes? ¿Deliro? :D

seoane
18-10-2006, 20:39:59
Hombre Dec, me has dejado estrañado :confused:

En las cadenas de texto (strings) tanto en C como en delphi, se manejan de una forma similar (por lo menos internamente), cada caracter se corresponde con un byte. Si tu escribes esos bytes a un archivo, tal cual, tienes un archivo de texto completamente legible. El caracter 'A' es igual al byte 65, da lo mismo si en un archivo de texto guardas una 'A' que si en un archivo binario guardas el byte 65. :o La verdad me siento un poco tonto explicandote esto a ti que seguro ya lo sabes ....

Por ejemplo:

var
F: File;
T: TextFile;
B: Byte;
begin
AssignFile(T,'d:\1.txt');
{$I-}
Rewrite(T);
{$I+}
if IOResult=0 then
begin
Write(T,'Hola');
CloseFile(T);
end;

AssignFile(F,'d:\1.bin');
{$I-}
Rewrite(F,1);
{$I+}
if IOResult=0 then
begin
B:= Ord('H');
BlockWrite(F,B,1);
B:= Ord('o');
BlockWrite(F,B,1);
B:= Ord('l');
BlockWrite(F,B,1);
B:= Ord('a');
BlockWrite(F,B,1);
CloseFile(F);
end;
end;


En el ejemplo anterior, ambos archivos son iguales. Y el segundo no puede ser mas "binario" :) . La única forma de hacer ilegible una cadena es el cifrado, entendiendo que cifrado no solo incluye métodos de criptografía como AES, si no también métodos tan simples como cambiar cada carácter por otro.

dec
18-10-2006, 20:50:45
Hola,

Pues entonces debo estar confundiendo churras con merinas, como suele decirse.


La verdad me siento un poco tonto explicandote esto a ti que seguro ya lo sabes ....


¡Huy, no creas! Yo es que engaño mucho. :D

Gracias Seoane por la explicación y todo. ;)