PDA

Ver la Versión Completa : Problema con funcion Para Archivos


angelp4492
28-12-2007, 02:34:18
Hola como estan?
Pues veran tengo un problema con esta funcion que no puedo echarla a andar.


if copy(date,1,5)='Upload' then
begin
memo1.Lines.Add(date);
SizeOfFile:=StrToInt(copy(date,7,pos('|',date)-7));
// memo1.Lines.Add(date);
delete(date,1,pos('|',date));
// memo1.Lines.Add(date);
// memo1.Lines.Add(intTostr(SizeOfFile));
UploadTo:=copy(date,1,Pos('|',date)-1);
memo1.Lines.Add(uploadto);
delete(date,1,pos('|',date));
ServerState:=sSRecieveingFile;
UFS:=TFileStream.Create(UploadTo,fmCreate or fmOpenWrite);
end;
case ServerState of sSRecieveingFile :
begin
try
begin
ufs.Write(date[1],length(date));
Dec(SizeOfFile,length(date));
if SizeOfFile = 0 then
begin
ServerState:=sSIdle;
socket.SendText('Resultado'+'Fichero Subido..');
UFs.free;
sleep(1500);
Socket.SendText('TomaFicheros'+ListFiles(ExtractFileDir(UploadTo)));
end;
end;
except begin
ufs.Free;
Socket.SendText('Resultado'+'Fallo al Subir Fichero');
end;
end;
end;
end;


La he estado testeando y el problema que tengo esq depues de chequear el if del principio y ver que la palabra recibida en el socket no es upload, el salto siguiente es hacia el case y hay esta el problema porq deberia de no hacer nada y pasar a otra cosa. Si me salta al case y no he mandado nin gun fichero pues entonces me da error de lectura..

Alguna idea de como podria solucionar esto.Gracias

jachguate
28-12-2007, 03:06:34
Hola.

He editado tu post original para añadir la etiqueta [delphi]. Verás que la presentación del código publicado está mucho mejor ahora.

Para ver cómo funciona la etiqueta, te recomiendo presionar el botón de "editar" tu mensaje original.

hasta luego.

;)

jachguate
28-12-2007, 03:13:08
con respecto de tu duda original, he cambiado la indentación para que resulte evidente el inicio fín de los bloques


if copy(date,1,5)='Upload' then
begin
memo1.Lines.Add(date);
SizeOfFile:=StrToInt(copy(date,7,pos('|',date)-7));
// memo1.Lines.Add(date);
delete(date,1,pos('|',date));
// memo1.Lines.Add(date);
// memo1.Lines.Add(intTostr(SizeOfFile));
UploadTo:=copy(date,1,Pos('|',date)-1);
memo1.Lines.Add(uploadto);
delete(date,1,pos('|',date));
ServerState:=sSRecieveingFile;
UFS:=TFileStream.Create(UploadTo,fmCreate or fmOpenWrite);
end;
case ServerState of
sSRecieveingFile :
begin
try
begin
ufs.Write(date[1],length(date));
Dec(SizeOfFile,length(date));
if SizeOfFile = 0 then
begin
ServerState:=sSIdle;
socket.SendText('Resultado'+'Fichero Subido..');
UFs.free;
sleep(1500);
Socket.SendText('TomaFicheros'+ListFiles(ExtractFileDir(UploadTo)));
end;
end;
except
begin
ufs.Free;
Socket.SendText('Resultado'+'Fallo al Subir Fichero');
end;
end;
end;
end;


Cómo podes ver, el case está fuera del begin/end que delimitan lo que se hará al cumplirse la condición del if.

He quitado algunos pares de begin/end que estaban de mas, y dejado el case dentro del bloque que se ejecuta al cumplirse la condición del if, que es lo que supongo que querés.


if copy(date,1,5)='Upload' then
begin
memo1.Lines.Add(date);
SizeOfFile:=StrToInt(copy(date,7,pos('|',date)-7));
delete(date,1,pos('|',date));
UploadTo:=copy(date,1,Pos('|',date)-1);
memo1.Lines.Add(uploadto);
delete(date,1,pos('|',date));
ServerState:=sSRecieveingFile;
UFS:=TFileStream.Create(UploadTo,fmCreate or fmOpenWrite);
case ServerState of
sSRecieveingFile :
try
ufs.Write(date[1],length(date));
Dec(SizeOfFile,length(date));
if SizeOfFile = 0 then
begin
ServerState:=sSIdle;
socket.SendText('Resultado'+'Fichero Subido..');
UFs.free;
sleep(1500);
Socket.SendText('TomaFicheros'+ListFiles(ExtractFileDir(UploadTo)));
end;
except
ufs.Free;
Socket.SendText('Resultado'+'Fallo al Subir Fichero');
end;
end;
end;


Hasta luego.

;)

angelp4492
28-12-2007, 15:01:07
Pues he cambiado el codigo por el que has puesto y no funciona, me manda el archivo pero esta vacio.

rcarrillom
28-12-2007, 15:29:17
Si no me equivoco, la condición del if nunca se va a cumplir

if copy(date,1,5)='Upload' then

porque la cadena que se extrae de date es de longitud 5 y se compara contra una de longitud 6.

jachguate
28-12-2007, 17:52:33
Si no me equivoco, la condición del if nunca se va a cumplir

if copy(date,1,5)='Upload' then

porque la cadena que se extrae de date es de longitud 5 y se compara contra una de longitud 6.

Claro!! ese y otros errores no consitían en tu pregunta original. Recordá que la responsabilidad de que esto funcione es tuya, no nuestra.

Hasta luego.

;)

angelp4492
28-12-2007, 18:04:51
Tienes toda la razon es verdad q la longitud de la palabra es 5, porq en el codigo original que tengo probando tengo puesto subir en vez de upload, y como ya no se que puede pasar me puedes decir un sitio donde vea algún ejemplo de transferencia de archivos via socket, asi la cambio q ya me tiene arto.

jachguate
28-12-2007, 18:19:36
Si estas dispuesto a cambiar toda la rutina. creo recordar que las INDY traian un demo de transferencia de archivos. No estoy seguro y ahora no tengo tiempo de verificar por mi mismo.

Los demos de las indy están en la página del proyecto indy (http://www.indyproject.org)

Hasta luego.

;)