2013-04-14 12 views
6

Come si copia un file su un server FTP? Il mio obiettivo è quello di copiare ftp://www.mysite.com/test.jpg in ftp://www.mysite.com/testcopy.jpg. Per rinominare un file, vorrei utilizzare:Come copiare un file su un server FTP?

var request = (FtpWebRequest)WebRequest.Create("ftp://www.mysite.com/test.jpg"); 
request.Credentials = new NetworkCredential(user, pass); 
request.Method = WebRequestMethods.Ftp.Rename; 
request.RenameTo = "testrename.jpg" 
request.GetResponse().Close(); 

FtpWebResponse resp = (FtpWebResponse)request.GetResponse(); 

Tuttavia, non esiste un metodo per copiare i file. Come faresti a copiare un file?

+0

Avete altri l'accesso al server? FTP è, in virtù del suo nome, più per il trasferimento di file che per la gestione remota di tali file. – Joe

+0

No, in realtà sto creando un'app Web FTP che chiunque può utilizzare. – msbg

+1

Quindi si dovrebbe leggere su RFC e vedere quali funzionalità sono effettivamente possibili con il protocollo. – Joe

risposta

10

Prova questa:

static void Main(string[] args) 
{ 
    CopyFile("countrylist.csv", "MySample.csv", "username", "password#"); 
} 

public static bool CopyFile(string fileName, string FileToCopy, string userName, string password) 
{ 
    try 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.mysite.net/" + fileName); 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 

     request.Credentials = new NetworkCredential(userName, password); 
     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     Stream responseStream = response.GetResponseStream(); 
     Upload("ftp://ftp.mysite.net/" + FileToCopy, ToByteArray(responseStream), userName, password); 
     responseStream.Close(); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

public static Byte[] ToByteArray(Stream stream) 
{ 
    MemoryStream ms = new MemoryStream(); 
    byte[] chunk = new byte[4096]; 
    int bytesRead; 
    while ((bytesRead = stream.Read(chunk, 0, chunk.Length)) > 0) 
    { 
     ms.Write(chunk, 0, bytesRead); 
    } 

    return ms.ToArray(); 
} 

public static bool Upload(string FileName, byte[] Image, string FtpUsername, string FtpPassword) 
{ 
    try 
    { 
     System.Net.FtpWebRequest clsRequest = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(FileName); 
     clsRequest.Credentials = new System.Net.NetworkCredential(FtpUsername, FtpPassword); 
     clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; 
     System.IO.Stream clsStream = clsRequest.GetRequestStream(); 
     clsStream.Write(Image, 0, Image.Length); 

     clsStream.Close(); 
     clsStream.Dispose(); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

Questa scarica il file a un ruscello, e poi lo carica.

+1

Grazie, questo funziona bene. – msbg

1

FtpWebRequest è una classe leggera. Microsoft ritiene che dovrebbe essere utilizzato dal semplice client per scaricare ed eliminare i file una volta terminato il client.

1

Immagino che non sia possibile farlo con FTP. Quello che puoi fare è scaricare il file che vuoi copiare e poi caricarlo con un nuovo nome. Per esempio:

 try 
     { 
      WebClient request = new WebClient(); 
      request.Credentials = new NetworkCredential(user, pass); 
      byte[] data = request.DownloadData(host); 
      MemoryStream file = new MemoryStream(data); 
      Upload(data); 
     } 
     catch (Exception ex) 
     { 

     } 

    ... 

    private void Upload(byte[] buffer) 
    { 
     try 
     { 
      FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(newname); 

      request.Method = WebRequestMethods.Ftp.UploadFile; 
      request.Credentials = new NetworkCredential(user, pass); 

      Stream reqStream = request.GetRequestStream(); 
      reqStream.Write(buffer, 0, buffer.Length); 
      reqStream.Close(); 

      var resp = (FtpWebResponse)request.GetResponse(); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
1

Nel nostro progetto abbiamo fatto someting come questo

// pass parameters according to your need, 
// the below code is done in a hard coded manner for clarity 
public void Copy() 
{ 
    // from where you want to copy 
    var downloadRequest = (FtpWebRequest)WebRequest.Create("ftp://www.mysite.com/test.jpg"); 
    downloadRequest.Credentials = new NetworkCredential("userName", "passWord"); 
    downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile; 

    var ftpWebResponse = (FtpWebResponse)downloadRequest.GetResponse(); 
    var downloadResponse = ftpWebResponse.GetResponseStream(); 

    int buffLength = 2048; 
    byte[] byteBuffer = new byte[buffLength]; 

    // bytes read from download stream. 
    // from documentation: When overridden in a derived class, reads a sequence of bytes from the 
    // current stream and advances the position within the stream by the number of bytes read. 
    int bytesRead = downloadResponse.Read(byteBuffer, 0, buffLength); 

    // the place where you want the file to go 
    var uploadRequest = (FtpWebRequest)WebRequest.Create("ftp://www.mysite.com/testCopy.jpg"); 
    uploadRequest.Credentials = new NetworkCredential("userName", "passWord"); 
    uploadRequest.Method = WebRequestMethods.Ftp.UploadFile; 

    var uploadStream = uploadRequest.GetRequestStream(); 

    if (bytesRead > 0) 
    { 
     while (bytesRead > 0) 
     { 
      uploadStream.Write(byteBuffer, 0, bytesRead); 
      bytesRead = downloadResponse.Read(byteBuffer, 0, buffLength); 
     } 
    } 

    uploadStream.Close(); 
    uploadStream.Dispose(); 

    downloadResponse.Close(); 
    ftpWebResponse.Close(); 
    ((IDisposable)ftpWebResponse).Dispose(); 
} 
Problemi correlati