2012-01-10 44 views
8

tengo este código de trabajo de esta link, para cargar un archivo a un sitio ftp:Subir archivos al sitio FTP usando VB.NET

' set up request... 
Dim clsRequest As System.Net.FtpWebRequest = _ 
    DirectCast(System.Net.WebRequest.Create("ftp://ftp.myserver.com/test.txt"), System.Net.FtpWebRequest) 
clsRequest.Credentials = New System.Net.NetworkCredential("myusername", "mypassword") 
clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 

' read in file... 
Dim bFile() As Byte = System.IO.File.ReadAllBytes("C:\Temp\test.txt") 

' upload file... 
Dim clsStream As System.IO.Stream = _ 
    clsRequest.GetRequestStream() 
clsStream.Write(bFile, 0, bFile.Length) 
clsStream.Close() 
clsStream.Dispose() 

me pregunto, si el archivo ya existe en el directorio ftp, el archivo será sobrescrito?

+2

¿por qué no lo intentas? – Orentet

+0

@Orentet hasta ahora No puedo eliminar/actualizar en el ftp, solo quiero seguir adelante y ver qué sucedería en ese caso. – Somebody

+0

Extraño, acabo de crear mi propia carga de archivos según su código y recibí una WebException (530) No estoy conectado ... – Ortund

Respuesta

8

En cuanto a la documentación MSDN esto se asigna al comando FTP STOR. Al mirar la definición del comando FTP STOR sobrescribirá los archivos existentes, si el usuario tiene permisos.

En este caso, sí, el archivo se sobrescribirá.

3

Desde: Link

STOR (STORE)

STOR

Este comando hace que el servidor FTP para aceptar los datos transferidos a través de la conexión de datos y almacenar los datos como un archivo en el servidor FTP servidor. Si el archivo especificado en pathname existe en el sitio del servidor, entonces su contenido debe ser reemplazado por los datos que se transfieren. Se crea un nuevo archivo en el servidor FTP si el archivo especificado en pathname no existe.

-1

Es importante saber que, Los archivos son solo referencias a punteros que apuntan a una matriz de bytes en la memoria.

Cuando se solicita a una operación de escritura de archivos que escriba un archivo en un puntero, no comprobará si el archivo existe; Simplemente, el sistema de archivos permitirá que la operación continúe a menos que se estén utilizando los bytes en la memoria (aunque puede forzar sobreescribir).

Si desea comprobar si un archivo existe antes de escribir el archivo usar mi método GetDirectory en VB.net aquí: https://stackoverflow.com/a/28664731/2701974

-1

utilizar esta función para la carga de archivos

Public Sub UploadFile (ByVal como secuencia _FileName , ByVal _UploadPath como secuencia, de ByVal como secuencia, _FTPUser _FTPPass ByVal como secuencia)

Dim _FileInfo Como Nueva System.IO.FileInfo (_FileName)

' Create FtpWebRequest object from the Uri provided 
Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest) 

' Provide the WebPermission Credintials 
_FtpWebRequest.Credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass) 

' By default KeepAlive is true, where the control connection is not closed 
' after a command is executed. 
_FtpWebRequest.KeepAlive = False 

' set timeout for 20 seconds 
_FtpWebRequest.Timeout = 20000 

' Specify the command to be executed. 
_FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 

' Specify the data transfer type. 
_FtpWebRequest.UseBinary = True 

' Notify the server about the size of the uploaded file 
_FtpWebRequest.ContentLength = _FileInfo.Length 

' The buffer size is set to 2kb 
Dim buffLength As Integer = 2048 
Dim buff(buffLength - 1) As Byte 

' Opens a file stream (System.IO.FileStream) to read the file to be uploaded 
Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead() 

Try 
    ' Stream to which the file to be upload is written 
    Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream() 

    ' Read from the file stream 2kb at a time 
    Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength) 

    ' Till Stream content ends 
    Do While contentLen <> 0 
     ' Write Content from the file stream to the FTP Upload Stream 
     _Stream.Write(buff, 0, contentLen) 
     contentLen = _FileStream.Read(buff, 0, buffLength) 
    Loop 

    ' Close the file stream and the Request Stream 
    _Stream.Close() 
    _Stream.Dispose() 
    _FileStream.Close() 
    _FileStream.Dispose() 
Catch ex As Exception 
    MessageBox.Show(ex.Message, "Upload Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
End Try 

End Sub

Modo de empleo:

'Sube archivos a través de FTP UploadFile ("c: \ UploadFile.doc", "ftp://FTPHostName/UploadPath/UploadFile.doc", "nombre de usuario", "contraseña")

0

Sí , El protocolo FTP sobrescribe los archivos existentes en la carga.


Tenga en cuenta que hay mejores formas de implementar la carga.

La forma más trivial de cargar un archivo binario a un servidor FTP usando.NET está utilizando WebClient.UploadFile:

Dim client As WebClient = New WebClient 
client.Credentials = New NetworkCredential("username", "password") 
client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", "C:\local\path\file.zip") 

Si necesita un control mayor, que no ofrece WebClient (como el cifrado TLS/SSL, etc.), utilice FtpWebRequest. forma fácil es simplemente copiar un FileStream de secuencia FTP usando Stream.CopyTo:

Dim request As FtpWebRequest = 
    WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip") 
request.Credentials = New NetworkCredential("username", "password") 
request.Method = WebRequestMethods.Ftp.UploadFile 

Using fileStream As Stream = File.OpenRead("C:\local\path\file.zip"), 
     ftpStream As Stream = request.GetRequestStream() 
    fileStream.CopyTo(ftpStream) 
End Using 

Si usted necesita para controlar un progreso de carga, lo que tienes que copiar el contenido de trozos de sí mismo:

Dim request As FtpWebRequest = 
    WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip") 
request.Credentials = New NetworkCredential("username", "password") 
request.Method = WebRequestMethods.Ftp.UploadFile 

Using fileStream As Stream = File.OpenRead("C:\local\path\file.zip"), 
     ftpStream As Stream = request.GetRequestStream() 
    Dim read As Integer 
    Do 
     Dim buffer() As Byte = New Byte(10240) {} 
     read = fileStream.Read(buffer, 0, buffer.Length) 
     If read > 0 Then 
      ftpStream.Write(buffer, 0, read) 
      Console.WriteLine("Uploaded {0} bytes", fileStream.Position) 
     End If 
    Loop While read > 0 
End Using 

para el Progreso GUI (WinForms ProgressBar), ver ejemplo de C# en:
How can we show progress bar for upload with FtpWebRequest

Si desea cargar todos los archivos de una carpeta, ver ejemplo de C# en
Upload directory of files using WebClient.

Cuestiones relacionadas