.NET FTP上载文件并保留原始日期时间

时间:2016-01-26 23:49:23

标签: c# .net ftp ftpwebrequest

我们有一台带有FTP over SSL的Windows 2008 R2 Web服务器。此应用程序使用.NET 4.5,当我上传文件时,文件上的日期/时间将更改为服务器上的当前日期/时间。有没有办法让上传的文件保留原始(上次修改)日期?

这就是我所拥有的:

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;

3 个答案:

答案 0 :(得分:2)

我知道我们可以分配文件属性: -

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

如果您可以在将原始日期保存到服务器之前提取原始日期,则可以更改文件属性....如下所示: -

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

我希望这能指出你正确的方向。

答案 1 :(得分:2)

实际上没有标准方法可以通过FTP协议更新远程文件的时间戳。这可能是FtpWebRequest不支持它的原因。

有两种非标准方式可以更新时间戳。非标MFMT命令:

MFMT yyyymmddhhmmss path

或非标准使用(否则为标准)MDTM命令:

MDTM yyyymmddhhmmss path

FtpWebRequest不允许您发送自定义命令。

请参阅示例How to send arbitrary FTP commands in C#

所以你必须使用第三方FTP库。

例如,WinSCP .NET assembly默认保留上传文件的时间戳。

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

请参阅a full example

请注意,WinSCP .NET程序集不是本机.NET程序集。它是一个围绕控制台应用程序的瘦.NET包装器。

(我是WinSCP的作者)

答案 2 :(得分:0)

这是一个较旧的问题,但是我将在此处添加解决方案。我使用了与{Martin Prikryl提出的解决方案类似的方法,并使用了MDTM命令。他的答案将DateTime格式的字符串显示为yyyymmddhhmmss,这是不正确的,因为它不能正确处理月份和24小时时间格式。在此答案中,我更正了此问题,并提供了使用C#的完整解决方案。

我使用了FluentFTP库,该库很好地处理了通过C#使用FTP的许多其他方面。要设置修改时间,该库不支持修改时间,但它具有Execute方法。使用FTP命令MDTM yyyyMMddHHmmss /path/to/file.txt将设置文件的修改时间。

注意:在我的情况下,我需要使用世界通用时间,对于您来说可能就是这种情况。

下面的代码显示了如何使用Execute方法连接到FTP并设置上次修改时间并发送MDTM命令。

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

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