.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;
实际上没有标准的方法可以通过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");