Dr. Aaron Dishno
Dr. Aaron Dishno

Reputation: 1919

.NET FTP Upload file and preserve original date time

We have a Windows 2008 R2 web server with FTP over SSL. This app uses .NET 4.5 and when I upload files, the date/time on the file changes to the current date/time on the server. Is there a way to have the uploaded file preserve the original (last modified) date?

Here is what I have:

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;

Upvotes: 2

Views: 3339

Answers (3)

ivcubr
ivcubr

Reputation: 2072

This is an older question, but I will add my solution here. I used an approach similar to the solution proposed by @Martin Prikryl, using the MDTM command. His answer shows the DateTime format string as yyyymmddhhmmss which is incorrect since it does not correctly handle the month and 24 hour time format. In this answer I corrected this issue and provided a full solution using C#.

I used the FluentFTP library which handles many other aspects of working with an FTP through C# very well. To set the modified time, this library does not support it but it has an Execute method. Using the FTP command MDTM yyyyMMddHHmmss /path/to/file.txt will set the modified time of the file.

NOTE: in my instance I needed to use the universal time, which may be the case for you.

The code below shows how to connect to the FTP and set the last modified time using the Execute method and sending the MDTM command.

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

FtpReply reply = client.Execute($"MDTM {DateTime.UtcNow.ToString("yyyyMMddHHmmss")} /path/to/file.txt");

Upvotes: 0

Martin Prikryl
Martin Prikryl

Reputation: 202271

There's really no standard way to update timestamp of a remote file over an FTP protocol. That's probably why the FtpWebRequest does not support it.

There are two non-standard ways to update the timestamp. Either a non-standard MFMT command:

MFMT yyyymmddhhmmss path

or a non-standard use of (otherwise standard) MDTM command:

MDTM yyyymmddhhmmss path

But the FtpWebRequest does not allow you to send a custom command either.

See for example How to send arbitrary FTP commands in C#.


So you have to use a 3rd party FTP library.

For example WinSCP .NET assembly preserves a timestamp of an uploaded file by default.

// 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();
}

See a full example.

Note that WinSCP .NET assembly is not a native .NET assembly. It's rather a thin .NET wrapper around a console application.

(I'm the author of WinSCP)

Upvotes: 2

Philo
Philo

Reputation: 1989

I know that we can assign file attributes:-

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

If you can extract the original date before you save it to the server, then you can change file attributes....something like this:-

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);

I hope this points you in the right direction.

Upvotes: 2

Related Questions