我有一个FTP,我想知道今天添加的文件。 (在我的业务规则中,文件没有更新,因此可以添加文件,然后根本无法修改或删除。)
我试过了:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://172.28.4.7/");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("{0} {1}", "ftp://172.28.4.7/", response.LastModified);
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
但是,正如预期的那样,在控制台中我得到了上次修改的日期。
你可以帮助我知道最后添加的文件吗?
答案 0 :(得分:1)
您必须检索远程文件的时间戳以选择您想要的(今天的文件)。
不幸的是,由于它不支持FTP MLSD
命令,因此没有真正可靠有效的方法来使用.NET框架提供的功能来检索时间戳。 MLSD
命令以标准化的机器可读格式提供远程目录的列表。命令和格式由RFC 3659标准化。
.NET框架支持的替代方案:
ListDirectoryDetails
method(FTP LIST
命令)检索目录中所有文件的详细信息,然后处理FTP服务器特定格式的详细信息
* nix格式:Parsing FtpWebRequest ListDirectoryDetails line
DOS / Windows格式:C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
GetDateTimestamp
method(FTP MDTM
命令)单独检索每个文件的时间戳。优点是响应由RFC 3659标准化为YYYYMMDDHHMMSS[.sss]
。缺点是你必须为每个文件发送一个单独的请求,这可能是非常低效的。
const string uri = "ftp://example.com/remote/path/file.txt";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("{0} {1}", uri, response.LastModified);
这是answer by @tretom显示的内容。
或者,您可以使用支持现代MLSD
命令的第三方FTP客户端实现,也可以在给定时间限制的情况下直接下载文件。
例如,WinSCP .NET assembly同时支持MLSD
和time constraints。
您的具体任务甚至还有一个示例:How do I transfer new/modified files only?
该示例适用于PowerShell,但很容易转换为C#:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Download today's times
TransferOptions transferOptions = new TransferOptions();
transferOptions.FileMask = "*>=" + DateTime.Today.ToString("yyyy-MM-dd");
session.GetFiles("/remote/path/*", @"C:\local\path\", false, transferOptions).Check();
}
(我是WinSCP的作者)
答案 1 :(得分:0)
首先,您必须使用“ ListDirectoryDetails ”获取所有目录详细信息:
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
以字符串[]获取响应。 通过检查String []项目中的“ DIR ”文本来检查字符串[] For File或Directory。
从字符串[]获取文件名后,再次使用以下方法请求每个和每个文件的“文件创建日期”:
ftpRequest.Method = WebRequestMethods.Ftp.GetDateTimestamp;
因此,您可以获取FTP服务器的文件添加日期。
答案 2 :(得分:0)
可能的同步解决方案(对某人可能有用):
数据容器类型:
public class Entity
{
public DateTime uploadDate { get; set; }
public string fileName { get; set; }
}
和Lister lass:
public class FTPLister
{
private List<Entity> fileList = new List<Entity>();
public List<Entity> ListFilesOnFTP(string ftpAddress, string user, string password)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpAddress);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(user, password);
List<string> tmpFileList = new List<string>();
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
while (!reader.EndOfStream)
{
tmpFileList.Add(reader.ReadLine());
}
}
Uri ftp = new Uri(ftpAddress);
foreach (var f in tmpFileList)
{
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(ftp, f));
req.Method = WebRequestMethods.Ftp.GetDateTimestamp;
req.Credentials = new NetworkCredential(user, password);
using (FtpWebResponse resp = (FtpWebResponse)req.GetResponse())
{
fileList.Add(new Entity() { fileName=f, uploadDate=resp.LastModified });
}
}
fileList = fileList.Where(p => p.uploadDate>=DateTime.Today && p.uploadDate<DateTime.Today.AddDays(1)).ToList();
return fileList;
}
}