C#FTP获取今天添加的文件

时间:2014-12-04 11:30:01

标签: c# .net ftp ftpwebrequest

我有一个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);

但是,正如预期的那样,在控制台中我得到了上次修改的日期。

你可以帮助我知道最后添加的文件吗?

3 个答案:

答案 0 :(得分:1)

您必须检索远程文件的时间戳以选择您想要的(今天的文件)。

不幸的是,由于它不支持FTP MLSD命令,因此没有真正可靠有效的方法来使用.NET框架提供的功能来检索时间戳。 MLSD命令以标准化的机器可读格式提供远程目录的列表。命令和格式由RFC 3659标准化。

.NET框架支持的替代方案:

或者,您可以使用支持现代MLSD命令的第三方FTP客户端实现,也可以在给定时间限制的情况下直接下载文件。

例如,WinSCP .NET assembly同时支持MLSDtime 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)

首先,您必须使用“ ListDirectoryDe​​tails ”获取所有目录详细信息:

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