我们有一台带有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;
答案 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");