Contamos con un servidor web Windows 2008 R2 con FTP sobre SSL. Esta aplicación usa .NET 4.5 y cuando subo archivos, la fecha / hora en el archivo cambia a la fecha / hora actual en el servidor. ¿Hay alguna forma de que el archivo cargado conserve la fecha original (última modificación)?

Esto es lo que tengo:

FtpWebRequest clsRequest = (FtpWebRequest)WebRequest.Create(FTPFilePath);
clsRequest.EnableSsl = true;
clsRequest.UsePassive = true;
clsRequest.Credentials = new NetworkCredential(swwwFTPUser, swwwFTPPassword);
clsRequest.Method = WebRequestMethods.Ftp.UploadFile;
Byte[] bFile = File.ReadAllBytes(LocalFilePath);
Stream clsStream = clsRequest.GetRequestStream();
clsStream.Write(bFile, 0, bFile.Length);
clsStream.Close();
clsStream.Dispose();
clsRequest = null;
2
Dr. Aaron Dishno 27 ene. 2016 a las 02:49

3 respuestas

La mejor respuesta

Realmente no existe una forma estándar de actualizar la marca de tiempo de un archivo remoto a través de un protocolo FTP. Probablemente por eso el FtpWebRequest no lo admite.

Hay dos formas no estándar de actualizar la marca de tiempo. O un comando MFMT no estándar:

MFMT yyyymmddhhmmss path

O un uso no estándar del comando MDTM (de lo contrario estándar):

MDTM yyyymmddhhmmss path

Pero el FtpWebRequest tampoco le permite enviar un comando personalizado.

Consulte, por ejemplo, Cómo enviar comandos FTP arbitrarios en C #.


Por lo tanto, debe utilizar una biblioteca FTP de terceros.

Por ejemplo, ensamblado de WinSCP .NET conserva una marca de tiempo de un archivo cargado de forma predeterminada.

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Upload
    session.PutFiles(@"c:\toupload\file.txt*", "/home/user/").Check();
}

Consulte un ejemplo completo.

Tenga en cuenta que el ensamblado de WinSCP .NET no es un ensamblado de .NET nativo. Es un envoltorio .NET bastante delgado alrededor de una aplicación de consola.

(Soy la autora de WinSCP)

2
Community 23 may. 2017 a las 12:16

Esta es una pregunta anterior, pero agregaré mi solución aquí. Usé un enfoque similar a la solución propuesta por @Martin Prikryl, usando el comando MDTM. Su respuesta muestra la cadena de formato DateTime como yyyymmddhhmmss que es incorrecta ya que no maneja correctamente el formato de mes y 24 horas. En esta respuesta, corrigí este problema y proporcioné una solución completa usando C #.

Usé la biblioteca FluentFTP que maneja muy bien muchos otros aspectos del trabajo con FTP a través de C #. Para establecer la hora de modificación, esta biblioteca no la admite pero tiene un método Execute. El uso del comando FTP MDTM yyyyMMddHHmmss /path/to/file.txt establecerá la hora de modificación del archivo.

NOTA: en mi caso, necesitaba usar la hora universal, que puede ser tu caso.

El siguiente código muestra cómo conectarse al FTP y establecer la hora de la última modificación usando el método Execute y enviando el comando MDTM.

FtpClient client = new FtpClient("ftp-address", "username", "password");
client.Connect();

FtpReply reply = client.Execute($"MDTM {DateTime.UtcNow.ToString("yyyyMMddHHmmss")} /path/to/file.txt");
0
ivcubr 20 ago. 2019 a las 14:50

Sé que podemos asignar atributos de archivo: -

//Change the file created time.
File.SetCreationTime(path, dtCreation);
//Change the file modified time.
File.SetLastWriteTime(path, dtModified);

Si puede extraer la fecha original antes de guardarla en el servidor, entonces puede cambiar los atributos del archivo ... algo como esto: -

Sftp sftp = new Sftp();
sftp.Connect(...);
sftp.Login(...);

// upload the file
sftp.PutFile(localFile, remoteFile);

// assign creation and modification time attributes
SftpAttributes attributes = new SftpAttributes();
System.IO.FileInfo info = new System.IO.FileInfo(localFile);
attributes.Created = info.CreationTime;
attributes.Modified = info.LastWriteTime;

// set attributes of the uploaded file
sftp.SetAttributes(remoteFile, attributes);

Espero que esto te señale en la dirección correcta.

2
Philo 27 ene. 2016 a las 00:53