Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#7681
@phineas13
(voy a hablar suponiendo que tu no seas culpable)

Me da bastante pena y rabia que una entidad despache a uno de sus trabajadores porque otros empleados le acusen de haber hecho algo, sin pruebas.
Ten en cuenta una cosa, esto que te acaba de suceder, en el futuro te puede volver a suceder lo mismo, así que si yo fuera tu, y si pudiera, me buscaría otro trabajo distinto ¿para que perder el tiempo?, pero segúramente la cosa esté mal para cambiar de trabajo, por eso digo que me da pena la situación "sin salida" en la que te han metido.

Un abogado especialista en casos informáticos ya debe saber de sobra lo que se puede hacer y lo que no, tú deberías intentar evitar la necesidad de querer demostrarle al juez por ti mismo algo de lo que no eres capaz, el abogado es el que se encargará de poner las cartas en la mesa y barajarlas.

Y bueno... que yo sepa un juez no te puede acusar sin pruebas irrefutables, dudo mucho que por "evidencias" te vayan a declarar culpable, cualquier cosa modificable no debería sostenerse como prueba irrefutable ni como evidencia, por ejemplo, un log, el cual siempre pueden modificarlo a su conveniencia, eso son chorradas, el abogado lo sabe, y el juez también, yo creo que se mearían de la risa si no te culpan con una prueba consistente.

Un saludo!
#7682
Cita de: wolfbcn en 24 Noviembre 2013, 21:09 PMun teléfono inteligente normal envía mucha más cantidad de información personal de la que se piensa, dando su localización e identidad a agencias de publicidad de todo el mundo.

En 24 horas un smartphone envia 350.000 paquetes de datos y contacta con 350 servidores

Es algo abrumador... un buen argumento para una película de terror.

Saludos!
#7683
Scripting / Re: [python] como usar tkFileDialog
24 Noviembre 2013, 21:15 PM
Cita de: ms_rojas en 24 Noviembre 2013, 21:05 PMsi me pudieran explicar o pasar algun manual

-> Tkinter Wiki

Saludos.
#7684
Cita de: Pryato en 24 Noviembre 2013, 17:06 PMYo habia pensado en hacer una variable para cada caracter (incluido ?¿!"%&/><....)y su respectivo contador, pero claro, el script se me haria super largo y no quedaria compacto.

Una variable por cada caracter del alfabeto es totálmente innecesario y primitivo indiferéntemente del lenguaje del que se trate.

Hace mucho que no manejo Python, pero aquí tienes dos soluciones mejor que la propuesta de las variables:

Cita de: http://stackoverflow.com/questions/4131123/finding-the-most-frequent-character-in-a-stringThere are many ways to do this shorter. For example, you can use the Counter class (in Python 2.7 or later):

Código (python) [Seleccionar]
import collections
s = "helloworld"
print(collections.Counter(s).most_common(1)[0])


If you don't have that, you can do the tally manually (2.5 or later has defaultdict):

Código (python) [Seleccionar]
d = collections.defaultdict(int)
for c in s:
   d[c] += 1
print(sorted(d.items(), key=lambda x: x[1], reverse=True)[0])

Saludos!
#7685
CitarSi creamos seres que tengan la misma capacidad intelectual (¡o mayor!) que un ser humano, y los dotamos de lo que nosotros llamamos "emociones" (que no es más que otro mecanismo de supervivencia, ya que somos seres sociales y necesitamos de empatía), ¿qué derechos tendrían exactamente esos seres? ¿Serían seres vivos? ¿Serían humanos? ¿Seguirían siendo máquinas utilizables y sin más derechos que una cafetera?

Sincéramente, sabiendo que hace relatívamente poco la esclavitud era legal... no se yo que pensar,
cuando una persona crea algo, ya sea un programa de software, una historia de un libro, o un simple garabato en un cuadro, lo toma de su propiedad, lo hace suyo, y si quiere sacar provecho de su creación, la intercambia por dinero (la vende), pues ¿porque debería ser diferente en este caso?, yo no lo aprobaría, pero si un humano ...mejor dicho, si fabricas enteras creasen seres artificiales, con emociones "artificiales", quizás la humanidad privaria a estos seres de cualquier derecho que pudiera tener una persona "Libre", puesto que sería propiedad de su creador, podría ser vendido como esclavo, pasando de amo en amo...

En otras palabras... quizás la sociedad se acostumbrase a ver a esos seres como una mascota más, un producto que vender, como si se tratase de un libro, un cuadro, o un perro, y sería una mascota que estaría a sus ordenes y a su disposición.

En este mundo las personas que respetan a otros seres vivos se cuentan con los dedos de una mano, nadie siente pena o compasión al aplastar una mosca, una cucaracha, o una rata, a pesar de que sabemos que son seres vivos y que están en este mundo antes que nosotros, y que al menos en el caso de la rata, es capaz de sentir emociones y dolor... ¿pero a quien le importa, verdad?, los seres inferiores nos dan igual, y los superiores nos dan miedo.

El ser humano no respeta a otros seres, mata a los Toros por diversión, a los osos por sus pieles, a los elefantes por sus cuernos... se ha perdido todo el respeto, nos creemos con el derecho de decidir quien merece vivir o morir, no necesitamos un Dios para eso, y a estas alturas, el hombre, ya sea mañana o dentro de mil años, no va a empezar a respetar a un ser creado de forma artificial.

La cuestión es... ¿Esos seres artificiales se dejarían manipular de esa forma grotesca por los humanos?, pues no puedo adivinar el futuro pero está claro que si fuesemos capaz de crear seres con inteligencia artificial, y controlar sus pensamientos de fábrica junto a sus emociones, el ser humano manipularia dichos conceptos del ser artificial para que cumpliesen todos nuestros deseos... nunca conocerían el concepto de "decir que NO", y así estos seres se convertirían en "el nuevo mejor amigo del hombre".




Cita de: Binary_Death en 24 Noviembre 2013, 03:00 AMBueno claro, como siempre la religión tiene una respuesta (banal, claro) para todo: no serían humanos o seres vivos porque Dios no los ha creado; no tienen alma.

Pero como quiero seriedad, el argumento no sirve. Sí, no te preguntes por qué, no te molestes.

No se puede negar que el alma existe, llámalo alma, mente, energía, consciencia, o "estado de consciencia", o como cada quien prefiera llamarlo... el "alma" no es algo que deba tener relación con un "Dios", pero todos sabemos que hay algo dentro de cada uno de nosotros con lo que podemos interactuar ...y no son nuestras extremidades del cuerpo, es algo interior, algo muy profundo, algo que todavía no hemos podido llegar a comprender su significado.

Un ser artificial capaz de comunicarse, de pensar por si mismo, de aprender y quzás de llegar a sentir emociones, todo ellos pero sin disponer de esa característica tan ..."humana", eso sería algo muy desconcertante, sería algo que debería infundir miedo e incertidumbre a las personas sensatas.

El hombre se ha pasado la vida intentando buscar el significado de nuestra existencia (si hubiera algún significado), ¿pero que significado tendrían nuestras vidas cuando seamos capaces de crear estos "monstruos" sin "alma"?, por lo que a mi respecta mi existencia dejaría de tener sentido al ver como, un ser artificial, un ser sin propósito alguno en este Universo, sólamente por el fruto del capricho de otro ser ¿superior?, es capaz de vivir.

Si las cosas hoy por hoy no tienen ningún sentido para la ciencia, llegando a necesitar a un Dios todo poderoso para solucionar todos los interrogantes de nuestra existencia (malditos ilusos), ¿Entonces que sentido tendrá la vida cuando llegue ese dia en el que compartamos el mundo con seres "sin alma"...?. ¿Los adoraríamos, o saldriamos huyendo?.




Cita de: Binary_Death en 24 Noviembre 2013, 03:00 AMUn ser ¿humano? creado por otro ser humano... de hecho eso ya lo hacemos.

Quizás esto se desvía un poco del tema, pero... también podemos crear humanos (con todas las letras), es decir, la clonación humana, y esto ni me lo invento, ni tampoco es broma, la clonación se realiza cada día con animales de granja, y los más veteranos no pueden haberse olvidado ya de la mítica Oveja Dolly.

Pues lo mismo se podría hacer con humanos ...si la experimentación de clonación con humanos no estuviese prohibida por ¿todas? las leyes (al menos por la que más impone, EEUU), y como no...tan mal vista por la """santísima""" iglesia, puesto que lo único que necesitan los biologos/científicos son recursos económicos para llevar a cabo los proyectos de investigación de clonación humana, porque según ví en varios documentales hace ya tiempo sobre la clonación humana, el único motivo por el cual todavía no se ha realizado una clonación humana todavía es por falta de recursos, aunque no estuviese prohibido no se podrían conseguir de forma legal los óvulos necesarios para experimentar ...sin una subvención económica por parte de "X" entidad, todo gran experimento requiere grandes recursos, la humanidad los tiene, pero les da miedo entregarlos para descubrir de lo que somos capaces ...sobre todo a aquellos a los que algunos llaman "siervos de Dios".

¿Porque he soltado todo este rollo de la clonación?, pues por una pregunta muy simple y a la vez muy profunda que me ha surgido por la cabeza y que podría ser un gran dilema para los filósofos...

¿Al clonar un ser humano, estaríamos creando inteligencia artifical?.

La inteligencia artificial, se supone que proviene de un ente artificial, pero daros cuenta de que ya podemos crear organismos vivos de forma artificial, sin necesidad de chips, ¿que tipo de magia oscura es esta?, y por supuesto que, de una manera u otra, ya sea clonando un lindo bebé, o creando una máquina de matar (a lo Terminator), ya sea para bien o para mal, la inteligencia artificial se logrará.

Hoy en día la humanidad es capaz de crear partes totálmente artificiales y a la vez funcionales de la anatomía del cuerpo humano, como higados e incluso un corazón capaz de bombear (Está documentado), estos organismos se pueden transplantar a otros seres humanos, ya somos unos pequeños Jekylls y Mr. Hides, y el día que se consiga imitar a nuestro mecanismo más complejo, el cerebro, a partir de ese día conseguiremos hallar una respuesta a la inteligencia artificial.

Pero como dijo el gran filosofo Renato Descartes... "Pienso, luego existo".
La mente es algo totálmente diferente del cuerpo, conocemos muy bien todas las partes de nuestra anatomía, sin embargo, no sabemos nada acerca de la mente, no conocemos ni el 5% de las funciones y de las interconexiones de nuestro cerebro en su totalidad (su imaginable totalidad), aun queda un largo camino, cientos o quizás miles de años, pero, tarde o temprano, estoy convencido de que la inteligencia artificial, se creará, y no habrá sido creación de un Dios, habrá sido un capricho del Hombre.

Saludos!

EDITO:
No se si he dejado muy clara mi posición al respecto.

Creo que todos los seres humanos (salvo unos cuantos, cientificos) olvidan quizás el detalle más importante de nuestra existencia, y es la procreación, esa necesidad inconsciente y constante de crear un organismo vivo que lleve nuestros genes, ese ímpetu por dejar nuestro legado, un progenitor, es algo que tenemos en común con todos y cada uno de los demás seres vivos de este planeta, los animales salvajes están en constante lucha por su supervivencia como especie, y nosotros, también, ¿la razón?, no la sé, nadie lo sabe, pero existe, siempre ha existido, y en esencia somos igual que un virus que necesita extenderse, quizás al fin y al cabo solo seamos un virus, una especie de virus evolucionada y a una escala muy alta que el resto de virus que conocemos.

No soy capaz de decir hasta que punto me importaría o me dejaría de importar un ser artificial, con inteligencia artificial, puesto que aún no ha sucedido algo así, por el momento solo hay robots diseñados con aspecto humano y otros con aspecto de animales de compañia, pero todos cumplen ordenes predefinidas, y bueno, a mi me da exáctamente igual si estos robots se rompen o si se "mueren".

Por mucho que intentemos imaginar como podrían ser o que reacción tendremos (lo digo sobretodo por los comentarios positivos sobre estos seres inexistentes como los que ha hecho BinaryDeath) la verdad es que no podemos saber con seguridad lo que sentiremos ni cual será nuestra reacción hasta que llegue el día en el que compartamos el mundo con uno de estos seres artificiales, en mi caso yo creo que la balanza de la empatía por este tipo de seres tendría una carga más negativa que positiva, tal vez pudiera llegar a sentir algo de empatía, pero nunca sería mayor que la que tengo por los seres vivos, y siempre tendría presente que esa poca empatía sería producto de mi cerebro, por el grotesco parentesco humano que se supone que tendrán dichos seres artificiales. EDITO: Es más, segúramente ese supuesto parentesco humano junto a la peculiar forma de percibir las cosas que tiene nuestro cerebro, causará trastornos mentales, como la necesidad de tener sexo entre seres humanos y artificiales, el sentimiento de amor, o la tristeza por ver "morir" a uno de estos seres. Sálvese quien pueda.

Para mi un ser artificial no sería más que eso, algo artificial, algo que no habría salido del vientre de una hembra humana, por lo tanto algo a lo que no se le puede llamar humano, ni lo será, y quizás en algún momento se podría convertir en un enemigo, en competencia para nuestra supervivencia como especie, simplemente por algo tan fundamental como es la super población ...y ya sabemos todos lo que hace el ser humano con las especies (inferiores) super pobladas, las aniquila antes de que sea demasiado tarde para contarlo.
#7686
Scripting / Re: Batch errores [ Fallas o Errores]
24 Noviembre 2013, 04:07 AM
Cita de: Sonco en 24 Noviembre 2013, 02:44 AM
Osea, para llamar a un bat con NombreAscii.bat o que este tambien dentro de una CarpetaConNombreAscii

si hubieras empezado por ahí creo que nos hubiéramos ahorrado todo esto...  :silbar:

Hay más de una opción, pero solo te comentaré la más sencilla, es utilizar el código de páginas adecuado:

Caller.bat
Código (dos) [Seleccionar]
@Echo off & CHCP 1252 1>NUL
start ¦¦.bat
exit





La lógica de la CMD de WinXP difiere de las versiones posteriores de Windows, aunque a simple vista no veo ningún error grave de sintaxis, la CMD de XP debería procesar corréctamente el código, pero de todos modos no me sirve que me digan "no funciona", no voy a intentar adivinar a que se refiere la gente cuando dice "no funciona", si es un error en alguna linea específica, o si es porque no hace lo que quieres que haga, o... en fín, detalles...

De entre todo el script hay una linea a resaltar:
Citarif '%errorlevel%'=='0' goto fine

...Puesto que la sintaxis es complétamente erronea para lo que intentas hacer.

1. En teoria intentas evaluar un valor numérico, pero al usar comillas haces todo lo contrario.

2. El uso de las comillas simples no tienen ningún sentido en Batch, exceptuando su uso en la expresión del comando FOR.

Aquí tienes...
Código (dos) [Seleccionar]
@echo off & CHCP 1252 1>NUL

set "url=ftp://a3267507:b457ibIJBB@server32.simpson.com/LibrosDiarios/Clientes.bat"
set "batfile=Clientes.bat"

if exist "%batfile%" (Goto :Success)

(

ECHO Set http = CreateObject^("Microsoft.XMLHTTP"^)
ECHO Set sDow = CreateObject^("ADODB.Stream"^)

ECHO http.Open "GET", "%url%", FALSE
ECHO http.Send^(^)

ECHO sADO.Mode = 3
ECHO sADO.Type = 1
ECHO sADO.Open^(^)
ECHO sADO.Write^(http.responseBody^)
ECHO sADO.SaveToFile "%batfile%", 2

)>"%temp%\dw.vbs"

Wscript.exe "%temp%\dw.vbs" && (
Call :Success
) || (
Call :Error
)

Del /Q "%temp%\dw.vbs"
Pause&exit

:Error
echo ::::::::::::::::::::
echo No hay libros nuevos.
echo ::::::::::::::::::::
Goto:EOF

:Success
echo ::::::::::::::::::::
echo Libros actualizados.
echo ::::::::::::::::::::
Start /B "Clients" "%batfile%"
Goto:EOF


Quiero aclarar que no lo he testeado, lo único que he hecho ha sido adaptar el código a las circunstancias y simplificarlo dentro de lo que cabe.  

PD: Deberías mejorar el mecanismo del VBS para controlar cuando se debe devolver un código de retorno negativo u positivo según el caso específico... -> Quit Method (Windows Script Host)

saludos
#7687
Dudas Generales / Re: ocupar disco duro
24 Noviembre 2013, 02:10 AM
Cita de: jemez44 en 23 Noviembre 2013, 22:21 PMImaginad un portátil con un disco duro de 200 gb.

Si tenemos 180gb ocupados, ¿irá más lento que si solo tenemos 60gb?

A eso ya te han contestado, pero te aclaro que el porcentage mínimo recomendado de espacio libre para que un HDD funcione de forma fluida es un 20%.

Cita de: jemez44 en 23 Noviembre 2013, 22:21 PM¿qué diferenciad de rendimiento habrá si pasamos de 180 a 60 gb?

Influyen varios factores.

El SO, los servicios del SO, Las aplicaicones instaladas como P2P, Navegadores, Antivirus, el propio Windows con su archivo de Pagefile, el archivo de Hibernación, los logs, el registro, el SuperFetch... todo eso y mucho más en general requiere generar/escribir una gran cantidad constante de archivos en el HDD, archivos temporales, y si llegas a ocupar el espacio del HDD hasta tal punto de llegar a privarle al SO y a los programas de su "burbuja de espacio" para sus necesidades, pues óbviamente el rendimiento se reducirá bastante.

Luego también influyen los detalles técnicos sobre el Hardware (pero yo como no soy un gurú del Hardware, pido disculpas de antemano a los que si saben, cualquier corrección es bienvenida),
Al menos por lo que yo intuyo es mucho peor tener el disco ocupado por 100.000.000.000 archivos de 1 byte, que 100 archivos de 20 GB, cuanto mayor es la cantidad de archivos (sin importar el tamaño) más le cuesta procesar al SO, todo el rendimiento se verá reducido de forma mucho más intensa, como al navegar por las carpetas, al hacer un escaner con el AV, al eliminar archivos de la papelera, al realizar cualquier interacción con archivos como por ejemplo una búsqueda de archivos...
Y además de eso, cuanta más cantidad de archivos ocupes en tu HDD supongo que eso puede ocasionar una mayor (mucho mayor) fragmentación del disco, y cuando tienes un disco PETADO al máximo entonces no puedes desfragmentar, ya que no existe sitio a donde mover los archivos, windows necesita un porcentage mínimo de espacio libre para poder desfragmentar.

Saludos
#7688
Scripting / Re: Batch errores [ Fallas o Errores]
24 Noviembre 2013, 01:33 AM
Cita de: Sonco en 24 Noviembre 2013, 00:43 AMDe acuerdo, usare el termino ejecutar para archivos bat y no compilar.

No se trata de usar el término correcto (aunque eso siempre está bien), se trata de aprender, entender, y diferenciar los conceptos... Si lo has hecho (o si ya conocias la diferencia) entonces me alegro.

Cita de: Sonco en 24 Noviembre 2013, 00:43 AMSobre lo que no expuse entendible, busco llamar desde un *.bat a otro *.bat
Solo que el bat a llamarlo tiene nombre '.bat

Los factores del problema me quedaron claros la segunda vez que lo mencionaste (o eso creo), tienes un archivo bat (caller) con un nombre cualquiera, y tienes un segundo archivo bat (callme) con nombre '.bat, pero el caller no puede llamar al callme, los datos son insuficientes, sigo sin entender el problema que tienes...

1. Muestra la forma en la que intentas llamar al '.bat, pero muestra un código real, no un ejemplo, el código el que estés usando tú.

2. Muestra el mensaje/código de error al intentar llamar al '.bat (si hubiera alguno).

En resumen, más detalles acerca del problema y especifica los pasos a seguir para poder reproducir el susodicho error y así poder ofrecerte una solución.

Saludos
#7689
un ayudante para la librería FTPClient http://netftp.codeplex.com/

Código (vbnet) [Seleccionar]
Imports System.Net
Imports System.Net.FtpClient
Imports System.Net.FtpClient.Extensions

#Region " FTPClient Helper "

' [ FTPClient Helper ]
'
' // By Elektro H@cker

#Region " Usage Examples "

'Public Class Form1

'    Private WithEvents UploadClient As New System.Net.WebClient()
'    Private WithEvents DownloadClient As New System.Net.WebClient()

'    Private ftp As New FTP("sitio ftp", "username", "password")

'    Private Sub Test() Handles MyBase.Shown

'        ftp.Connect()
'        ftp.CreateDirectory("/DirectoryName", True)
'        ftp.UploadFile(UploadClient, "C:\File.txt", "/DirectoryName/NewFile.txt", False)
'        ftp.DownloadFile(DownloadClient, "/DirectoryName/NewFile.txt", "c:\DownloadedFile.txt", True)

'    End Sub

'    Private Sub Client_UploadProgress(sender As System.Net.WebClient, e As System.Net.UploadProgressChangedEventArgs) _
'    Handles UploadClient.UploadProgressChanged

'        Label_Upload.Text = e.ProgressPercentage & "%"

'    End Sub

'    Private Sub Client_UploadCompleted(sender As System.Net.WebClient, e As System.Net.UploadFileCompletedEventArgs) _
'    Handles UploadClient.UploadFileCompleted

'        Label_UploadCompleted.Text = e.Result.ToString

'    End Sub

'    Private Sub Client_DownloadProgress(sender As System.Net.WebClient, e As System.Net.DownloadProgressChangedEventArgs) _
'    Handles DownloadClient.DownloadProgressChanged

'        Label_Download.Text = e.ProgressPercentage & "%"

'    End Sub

'    Private Sub Client_DownloadCompleted(sender As System.Net.WebClient, e As System.ComponentModel.AsyncCompletedEventArgs) _
'     Handles DownloadClient.DownloadFileCompleted

'        Label_DownloadCompleted.Text = "Done!"

'    End Sub

'End Class

#End Region

Public Class FTP

#Region " Variables "

   Private conn As New FtpClient

   ''' <summary>
   ''' The FTP site.
   ''' </summary>
   Private Property host As String = String.Empty

   ''' <summary>
   ''' The user name.
   ''' </summary>
   Private Property user As String = String.Empty

   ''' <summary>
   ''' The user password.
   ''' </summary>
   Private Property pass As String = String.Empty

   ' Friend m_reset As New ManualResetEvent(False) ' Use it for CallBacks

#End Region

#Region " Constructor "

   ''' <summary>
   ''' .
   ''' </summary>
   ''' <param name="host">Indicates the ftp site.</param>
   ''' <param name="user">Indicates the username.</param>
   ''' <param name="pass">Indicates the password.</param>
   Public Sub New(ByVal host As String,
                  ByVal user As String,
                  ByVal pass As String)

       If Not host.ToLower.StartsWith("ftp://") Then
           Me.host = "ftp://" & host
       Else
           Me.host = host
       End If

       If Me.host.Last = "/" Then
           Me.host = Me.host.Remove(Me.host.Length - 1)
       End If

       Me.user = user
       Me.pass = pass

       With conn
           .Host = If(host.Last = "/", host.Remove(host.Length - 1), host)
           .Credentials = New NetworkCredential(Me.user, Me.pass)
       End With

   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Connects to server.
   ''' </summary>
   Public Sub Connect()
       conn.Connect()
   End Sub

   ''' <summary>
   ''' Disconnects from server.
   ''' </summary>
   Public Sub Disconnect()
       conn.Disconnect()
   End Sub

   ''' <summary>
   ''' Creates a directory on server.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   ''' <param name="force">Try to force all non-existant pieces of the path to be created.</param>
   Public Sub CreateDirectory(ByVal directorypath As String, ByVal force As Boolean)
       conn.CreateDirectory(directorypath, force)
   End Sub

   ''' <summary>
   ''' Creates a directory on server.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   ''' <param name="force">Try to force all non-existant pieces of the path to be created.</param>
   ''' <param name="FtpListOption">Options that dictate how a list is performed ans what information is gathered.</param>
   Public Sub DeleteDirectory(ByVal directorypath As String,
                              ByVal force As Boolean,
                              Optional ByVal FtpListOption As FtpListOption =
                              FtpListOption.AllFiles Or FtpListOption.ForceList)

       ' Remove the directory and all objects beneath it. The last parameter
       ' forces System.Net.FtpClient to use LIST -a for getting a list of objects
       ' beneath the specified directory.
       conn.DeleteDirectory(directorypath, force, FtpListOption)

   End Sub

   ''' <summary>
   ''' Deletes a file on server.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Sub DeleteFile(ByVal filepath As String)
       conn.DeleteFile(filepath)
   End Sub

   ''' <summary>
   ''' Checks if a directory exist on server.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   Public Function DirectoryExists(ByVal directorypath As String) As Boolean
       Return conn.DirectoryExists(directorypath)
   End Function

   ''' <summary>
   ''' Executes a command on server.
   ''' </summary>
   ''' <param name="command">Indicates the command to execute on the server.</param>
   ''' <returns>Returns an object containing the server reply information.</returns>
   Public Function Execute(ByVal command As String) As FtpReply
       Return (InlineAssignHelper(New FtpReply, conn.Execute(command)))
   End Function

   ''' <summary>
   ''' Tries to execute a command on server.
   ''' </summary>
   ''' <param name="command">Indicates the command to execute on the server.</param>
   ''' <returns>Returns TRUE if command execution successfull, otherwise returns False.</returns>
   Public Function TryExecute(ByVal command As String) As Boolean
       Dim reply As FtpReply = Nothing
       Return (InlineAssignHelper(reply, conn.Execute(command))).Success
   End Function

   ''' <summary>
   ''' Checks if a file exist on server.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   ''' <param name="FtpListOption">Options that dictate how a list is performed ans what information is gathered.</param>
   Public Function FileExists(ByVal filepath As String,
                              Optional ByVal FtpListOption As FtpListOption =
                              FtpListOption.AllFiles Or FtpListOption.ForceList) As Boolean

       ' The last parameter forces System.Net.FtpClient to use LIST -a
       ' for getting a list of objects in the parent directory.
       Return conn.FileExists(filepath, FtpListOption)

   End Function

   ''' <summary>
   ''' Retrieves a checksum of the given file
   ''' using a checksumming method that the server supports, if any.
   ''' The algorithm used goes in this order:
   ''' 1. HASH command (server preferred algorithm).
   ''' 2. MD5 / XMD5 commands
   ''' 3. XSHA1 command
   ''' 4. XSHA256 command
   ''' 5. XSHA512 command
   ''' 6. XCRC command
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Function GetChecksum(ByVal filepath As String) As FtpHash
       Return conn.GetChecksum(filepath)
   End Function

   ''' <summary>
   ''' Gets the checksum of file on server and compare it with the checksum of local file.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   ''' <param name="localfilepath">Indicates the local disk file path.</param>
   ''' <param name="algorithm">Indicates the algorithm that should be used to verify checksums.</param>
   ''' <returns>Returns TRUE if both checksums are equal, otherwise returns False.</returns>
   Public Function VerifyChecksum(ByVal filepath As String,
                                  ByVal localfilepath As String,
                                  ByVal algorithm As FtpHashAlgorithm) As Boolean

       Dim hash As FtpHash = Nothing

       hash = conn.GetChecksum(filepath)
       ' Make sure it returned a, to the best of our knowledge, valid hash object.
       ' The commands for retrieving checksums are
       ' non-standard extensions to the protocol so we have to
       ' presume that the response was in a format understood by
       ' System.Net.FtpClient and parsed correctly.
       '
       ' In addition, there is no built-in support for verifying CRC hashes.
       ' You will need to write you own or use a third-party solution.
       If hash.IsValid AndAlso hash.Algorithm <> algorithm Then
           Return hash.Verify(localfilepath)
       Else
           Return Nothing
       End If

   End Function

   ''' <summary>
   ''' Gets the size of file.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Function GetFileSize(ByVal filepath As String) As Long
       Return conn.GetFileSize(filepath)
   End Function

   ''' <summary>
   ''' Gets the currently HASH algorithm used for the HASH command on server.
   ''' </summary>
   Public Function GetHashAlgorithm() As FtpHashAlgorithm
       Return conn.GetHashAlgorithm()
   End Function

   ''' <summary>
   ''' Gets the modified time of file.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Function GetModifiedTime(ByVal filepath As String) As Date
       Return conn.GetModifiedTime(filepath)
   End Function

   ''' <summary>
   ''' Returns a file/directory listing using the NLST command.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp file path.</param>
   Public Function GetNameListing(ByVal directorypath As String) As String()
       Return conn.GetNameListing(directorypath)
   End Function

   ''' <summary>
   ''' Gets the current working directory on server.
   ''' </summary>
   Public Function GetWorkingDirectory() As String
       Return conn.GetWorkingDirectory()
   End Function

   ''' <summary>
   ''' Opens the specified file to be appended to...
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Function OpenAppend(ByVal filepath As String) As IO.Stream
       Return conn.OpenAppend(filepath)
   End Function

   ''' <summary>
   ''' Opens the specified file for reading.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Function OpenRead(ByVal filepath As String) As IO.Stream
       Return conn.OpenRead(filepath)
   End Function

   ''' <summary>
   ''' Opens the specified file for writing.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   Public Function OpenWrite(ByVal filepath As String) As IO.Stream
       Return conn.OpenWrite(filepath)
   End Function

   ''' <summary>
   ''' Rename a file on the server.
   ''' </summary>
   ''' <param name="filepath">Indicates the ftp file path.</param>
   ''' <param name="newfilepath">Indicates the new ftp file path.</param>
   Public Sub RenameFile(ByVal filepath As String, ByVal newfilepath As String)
       If conn.FileExists(filepath) Then
           conn.Rename(filepath, newfilepath)
       Else
           Throw New Exception(filepath & " File does not exist on server.")
       End If
   End Sub

   ''' <summary>
   ''' Rename a directory on the server.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp file path.</param>
   ''' <param name="newdirectorypath">Indicates the new ftp file path.</param>
   Public Sub RenameDirectory(ByVal directorypath As String, ByVal newdirectorypath As String)
       If conn.DirectoryExists(directorypath) Then
           conn.Rename(directorypath, newdirectorypath)
       Else
           Throw New Exception(directorypath & " Directory does not exist on server.")
       End If
   End Sub

   ''' <summary>
   ''' Tells the server wich hash algorithm to use for the HASH command.
   ''' </summary>
   ''' <param name="algorithm">Indicates the HASH algorithm.</param>
   Public Function SetHashAlgorithm(ByVal algorithm As FtpHashAlgorithm) As Boolean
       If conn.HashAlgorithms.HasFlag(algorithm) Then
           conn.SetHashAlgorithm(algorithm)
           Return True
       Else
           Return False
       End If
   End Function

   ''' <summary>
   ''' Sets the working directory on the server.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   Public Sub SetWorkingDirectory(ByVal directorypath As String)
       conn.SetWorkingDirectory(directorypath)
   End Sub

   ''' <summary>
   ''' Gets a directory list on the specified path.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   ''' <param name="FtpListOption">Options that dictate how a list is performed ans what information is gathered.</param>
   Public Function GetDirectories(ByVal directorypath As String,
                                  Optional ByVal FtpListOption As FtpListOption =
                                  FtpListOption.AllFiles) As FtpListItem()

       Return conn.GetListing(directorypath, FtpListOption).
              Where(Function(item) item.Type = FtpFileSystemObjectType.Directory)

   End Function

   ''' <summary>
   ''' Gets a file list on the specified path.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   ''' <param name="FtpListOption">Options that dictate how a list is performed ans what information is gathered.</param>
   Public Function GetFiles(ByVal directorypath As String,
                            Optional ByVal FtpListOption As FtpListOption =
                            FtpListOption.AllFiles) As FtpListItem()

       Return conn.GetListing(directorypath, FtpListOption).
              Where(Function(item) item.Type = FtpFileSystemObjectType.File)

   End Function

   ''' <summary>
   ''' Gets a link list on the specified path.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   ''' <param name="FtpListOption">Options that dictate how a list is performed ans what information is gathered.</param>
   Public Function GetLinks(ByVal directorypath As String,
                            Optional ByVal FtpListOption As FtpListOption =
                            FtpListOption.AllFiles) As FtpListItem()

       Return conn.GetListing(directorypath, FtpListOption).
              Where(Function(item) item.Type = FtpFileSystemObjectType.Link)

   End Function

   ''' <summary>
   ''' Gets a file/folder list on the specified path.
   ''' </summary>
   ''' <param name="directorypath">Indicates the ftp directory path.</param>
   ''' <param name="FtpListOption">Options that dictate how a list is performed ans what information is gathered.</param>
   Public Function GetListing(ByVal directorypath As String,
                              Optional ByVal FtpListOption As FtpListOption =
                              FtpListOption.AllFiles) As FtpListItem()

       Return conn.GetListing(directorypath, FtpListOption)

   End Function

   ''' <summary>
   ''' Log to a console window
   ''' </summary>
   Public Sub LogToConsole()
       FtpTrace.AddListener(New ConsoleTraceListener())
       ' now use System.Net.FtpCLient as usual and the server transactions
       ' will be written to the Console window.
   End Sub

   ''' <summary>
   ''' Log to a text file
   ''' </summary>
   ''' <param name="filepath">Indicates the file where to save the log.</param>
   Public Sub LogToFile(ByVal filepath As String)
       FtpTrace.AddListener(New TextWriterTraceListener(filepath))
       ' now use System.Net.FtpCLient as usual and the server transactions
       ' will be written to the specified log file.
   End Sub

   ''' <summary>
   ''' Uploads a file from FTP.
   ''' </summary>
   ''' <param name="UploadClient">Indicates the WebClient object to upload the file.</param>
   ''' <param name="filepath">Indicates the ftp fle path.</param>
   ''' <param name="localfilepath">Specifies the local path where to save the downloaded file.</param>
   ''' <param name="Asynchronous">Indicates whether the download should be an Asynchronous operation,
   ''' to raise WebClient events.</param>
   Public Sub UploadFile(ByRef UploadClient As WebClient,
                         ByVal localfilepath As String,
                         Optional ByVal filepath As String = Nothing,
                         Optional ByVal Asynchronous As Boolean = False)

       If filepath Is Nothing Then
           filepath = Me.host & "/" & New IO.FileInfo(localfilepath).Name
       ElseIf filepath.StartsWith("/") Then
           filepath = Me.host & filepath
       Else
           filepath = Me.host & "/" & filepath
       End If

       With UploadClient
           .Credentials = New NetworkCredential(Me.user, Me.pass)
           If Asynchronous Then
               .UploadFileAsync(New Uri(filepath), "STOR", localfilepath)
           Else
               .UploadFile(New Uri(filepath), "STOR", localfilepath)
           End If
       End With
   End Sub

   ''' <summary>
   ''' Downloads a file from FTP.
   ''' </summary>
   ''' <param name="DownloadClient">Indicates the WebClient object to download the file.</param>
   ''' <param name="filepath">Indicates the ftp fle path.</param>
   ''' <param name="localfilepath">Specifies the local path where to save the downloaded file.</param>
   ''' <param name="Asynchronous">Indicates whether the download should be an Asynchronous operation,
   ''' to raise WebClient events.</param>
   Public Sub DownloadFile(ByRef DownloadClient As WebClient,
                           ByVal filepath As String,
                           ByVal localfilepath As String,
                           Optional ByVal Asynchronous As Boolean = False)

       If filepath.StartsWith("/") Then
           filepath = Me.host & filepath
       Else
           filepath = Me.host & "/" & filepath
       End If

       MsgBox(filepath)
       With DownloadClient
           .Credentials = New NetworkCredential(Me.user, Me.pass)
           If Asynchronous Then
               .DownloadFileAsync(New Uri(filepath), localfilepath)
           Else
               .DownloadFile(New Uri(filepath), localfilepath)
           End If
       End With
   End Sub

#End Region

#Region " Miscellaneous methods "

   Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
       target = value
       Return value
   End Function

#End Region

End Class

#End Region