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

本文关键字:保留 原始 日期 时间 文件 FTP NET | 更新日期: 2023-09-27 18:31:57

我们有一个Windows 2008 R2 Web服务器,带有SSL上的FTP。此应用程序使用 .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;

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

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

有两种

非标准方法可以更新时间戳。非标准MFMT命令:

MFMT yyyymmddhhmmss path
或非标准

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

MDTM yyyymmddhhmmss path

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

例如,请参阅如何在 C# 中发送任意 FTP 命令。


因此,您必须使用第三方FTP库。

例如,WinSCP .NET 程序集默认保留上载文件的时间戳。

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

查看完整示例。

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

(我是WinSCP的作者)

我知道

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

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

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

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

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

注意:在我的例子中,我需要使用通用时间,这可能是您的情况。

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

FtpClient client = new FtpClient("ftp-address", "username", "password");
client.Connect();
FtpReply reply = client.Execute($"MDTM {DateTime.UtcNow.ToString("yyyyMMddHHmmss")} /path/to/file.txt");