Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problemas y dudas enviando comandos al servidor FTP con Indy (https://www.clubdelphi.com/foros/showthread.php?t=52755)

Gromeer 30-01-2008 12:01:10

Problemas y dudas enviando comandos al servidor FTP con Indy
 
Hola, antes de nada presentarme pues es mi primer mensaje en el foro.
Me llamo Miguel, soy de las Islas Baleares y recientemente he empezado a trastear con los componentes Indy.

Mi problema es el siguiente, tengo un servidor FTP al cual si yo hago un HELP me devuelve el listado de comandos, entre ellos PROMPT y MDELETE que son los que me estan dando problemas.

Pruebo ambos comandos desde la consola de MS-DOS y funcionan correctamente, pero a la hora de usarlos via SendCmd('PROMPT',250); o SendCmd('MDELETE '+vPath,250); que son las funciones para enviar comandos al servidor, siempre me devuelve un error 500 "Command not understood"

Lo que necesito es borrar un directorio sin que pida confirmacion y borrando todo el contenido del directorio en si. Ignoro si existe algun metodo en los Indy que me permita hacerlo directamente, he estado buscando pero no he visto nada. Supongo que alguien se habra encontrado con el mismo problema alguna vez.

Por cierto, la version de Indy que uso es la 9 para delphi 5

Gracias por adelantado, un saludo :)

jachguate 30-01-2008 18:34:45

Para eliminar un directorio, usá el método RemoveDir.

Hasta luego.

;)

Gromeer 31-01-2008 09:25:21

Hola! Gracias por contestar, pero el método RemoveDir no me sirve, dado que este método realiza esta llamada SendCmd('RMD ' + ADirName, 250); y el comando FTP RMD no borra directorios si no están vacios y yo necesito algo que borre tanto el directorio como todo lo que pudiera contener.

Por eso mi idea era utilizar el comando FTP MDELETE desactivando la confirmación con un PROMPT pero al enviar esos dos comandos el servidor me devuelve un error "command not understood".

Gracias de nuevo y un saludo.

jachguate 31-01-2008 10:30:04

Me temo que mdelete es un comando que implementa el cliente de ftp, y no el servidor.

He llegado a esta conclusión después de hacer algunas pruebas y buscar por un rato.

Si te fijas en la definición del protocolo ftp, no hay referencia alguna al comando.

Además, viendo la salida que normalmente produce:
Código:

ftp> MDELETE c*
mdelete cat1? y
200 DELE command okay.
mdelete cat2? y
200 DELE command okay.
mdelete cat3?
200 DELE command okay.
mdelete cata4? n
ftp>

A mi me parece que el cliente está enviando tantos comandos DELE como sea necesario para borrar los archivos que cumplan con el criterio.

Algo similar debe ocurrir con el comando prompt.

Hasta luego.

;)

Gromeer 31-01-2008 12:07:13

Hola de nuevo!

Tanto el PROMPT como el MDELETE son comandos del servidor, pero no son comandos RAW
Si envias un HELP al servidor te devuelve un listado con los comandos posibles y, en mi caso, tengo PROMPT y MDELETE, ambos comandos funcionan correctamente conectando desde una consola MS-DOS.
Es decir, me extraña que sean comandos del cliente cuando al consultar al servidor te los devuelve en la lista de comandos posibles.

De todos modos, sea como sea, no me resuelve mi problema! :D

Creo que tendre que crearme una funcion recursiva que recorra los posibles subdirectorios y archivos a borrar.


Un saludo.

jachguate 31-01-2008 16:01:25

Francamente no se cual es tu sustento para decir que es un comando del servidor. El listado que has referenciado no dice nada acerca de dicho comando.

El hecho de que se muestre en el help, para mi, no es sino evidencia de que el comando help se interpreta también localmente.

Una muestra mas de ello es que, al tener windows en español, si introducis el comando help mdelete te mostrará la ayuda de dicho comando ¡en español!, independientemente del idioma en que responda el servidor. Esto, en mi caso también ocurre para todos los comandos.

Otra muestra de ello, es la diferencia que tenemos en el help del cliente de consola windows y el de consola de linux si nos conectamos al mismo servidor:

Windows:
Código:

C:\Documents and Settings\Mario Antonio>ftp castilloit.com
Conectado a castilloit.com.
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 3 of 50 allowed.
220-Local time is now 08:56. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Usuario (castilloit.com:(none)): xxx
331 User castillo OK. Password required
Contraseña:
230-User xxx has group access to:  xxx
230 OK. Current restricted directory is /
ftp> help
Los comandos se pueden abreviar.  Comandos:

!              delete          literal        prompt          send
?              debug          ls              put            status
append          dir            mdelete        pwd            trace
ascii          disconnect      mdir            quit            type
bell            get            mget            quote          user
binary          glob            mkdir          recv            verbose
bye            hash            mls            remotehelp
cd              help            mput            rename
close          lcd            open            rmdir
ftp>

Linux:

Código:

jcastillo@hyperlink-gateway:~$ ftp ftp.castilloit.com
Connected to ftp.castilloit.com.
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 08:48. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (ftp.castilloit.com:jcastillo): xxx
331 User castillo OK. Password required
Password:
230-User xxx has group access to:  xxx
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> help
Commands may be abbreviated.  Commands are:

!              debug          mdir            qc              send
$              dir            mget            sendport        site
account        disconnect      mkdir          put            size
append          exit            mls            pwd            status
ascii          form            mode            quit            struct
bell            get            modtime        quote          system
binary          glob            mput            recv            sunique
bye            hash            newer          reget          tenex
case            help            nmap            rstatus        tick
cd              idle            nlist          rhelp          trace
cdup            image          ntrans          rename          type
chmod          lcd            open            reset          user
close          ls              prompt          restart        umask
cr              macdef          passive        rmdir          verbose
delete          mdelete        proxy          runique        ?
ftp>

¿Ves la diferencia?

Finalmente, en esta otra página del mismo sitio, le clasifica como "client command", mientras que dice esto:

Cita:

Empezado por nsftools
If you need to use the "raw" FTP commands instead of these interpreted commands (for example, if you're writing your own FTP client), please consult this list instead.

Donde "this list" es el listado que ya vos nos habías dado.

Hasta luego.

;)

jachguate 31-01-2008 16:04:10

Por cierto... si yo envío un comando HELP a mi servidor ftp con el cliente de las INDY (asi estoy seguro que es el servidor el que responderá) obtengo un flamante timeout. No se si será medida de seguridad o que... lo cierto es que no me responde.

¿a vos si?
¿incluye el comando mdelete? :confused: La verdad, estoy convencido que no lo hará!

Hasta luego.

;)

Gromeer 01-02-2008 12:22:07

Efectivamente se tratan de comandos del cliente, menudo lio que me había hecho. Ahora solo me falta averiguar una manera de borrar todo un directorio y su contenido sin recurrir a una función recursiva, valga la redundancia :cool:

Muchas gracias por tu aclaración, seguiré investigando.

jachguate 01-02-2008 23:27:04

mmm... A menos que estes seguro que el directorio, no tendrá subdirectorios, te verás obligado a usar recursividad, o a simularla con una pila, lo que resulta mas costoso en términos de tiempo de desarrollo. ¡No hay de otra!

¿Por qué tanto afán en evitar la recursividad?

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 00:00:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi