首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在FtpWebRequest之前检查FTP上是否存在文件

如何在FtpWebRequest之前检查FTP上是否存在文件
EN

Stack Overflow用户
提问于 2008-12-07 18:44:13
回答 4查看 100.3K关注 0票数 68

我需要使用FtpWebRequest将一个文件放到FTP目录中。在上传之前,我首先想知道这个文件是否存在。

我应该使用什么方法或属性来检查该文件是否存在?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-07 23:40:39

代码语言:javascript
复制
var request = (FtpWebRequest)WebRequest.Create
    ("ftp://ftp.domain.com/doesntexist.txt");
request.Credentials = new NetworkCredential("user", "pass");
request.Method = WebRequestMethods.Ftp.GetFileSize;

try
{
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
    FtpWebResponse response = (FtpWebResponse)ex.Response;
    if (response.StatusCode ==
        FtpStatusCode.ActionNotTakenFileUnavailable)
    {
        //Does not exist
    }
}

一般来说,在代码中为功能使用异常是一个糟糕的想法,但在这种情况下,我相信这是实用主义的胜利。目录上的呼叫列表可能比以这种方式使用异常的效率低得多。

如果不是,请注意这不是一个好的练习!

编辑:“这对我很有效!”

这似乎适用于大多数ftp服务器,但不是所有服务器。一些服务器需要发送"TYPE I“才能使用SIZE命令。人们会认为这个问题应该像下面这样解决:

代码语言:javascript
复制
request.UseBinary = true;

不幸的是,这是一个设计上的限制(大错误!)除非FtpWebRequest正在下载或上传文件,否则它不会发送"TYPE“。请参阅讨论和微软响应here

我建议使用下面的WebRequestMethod,它适用于我测试的所有服务器,即使是那些不会返回文件大小的服务器。

代码语言:javascript
复制
WebRequestMethods.Ftp.GetDateTimestamp
票数 118
EN

Stack Overflow用户

发布于 2015-09-16 23:39:42

因为

代码语言:javascript
复制
request.Method = WebRequestMethods.Ftp.GetFileSize

在某些情况下可能会失败(550:在ASCII模式下不允许大小),您可以只检查时间戳。

代码语言:javascript
复制
reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password);
reqFTP.UseBinary = true;
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;
票数 9
EN

Stack Overflow用户

发布于 2021-08-11 07:57:32

你可以使用WebRequestMethods.Ftp.ListDirectory来检查文件是否存在,不需要讨厌的try catch机制。

代码语言:javascript
复制
    private static bool ExistFile(string remoteAddress)
    {
        int pos = remoteAddress.LastIndexOf('/');
        string dirPath = remoteAddress.Substring(0, pos); // skip the filename only get the directory

        NetworkCredential credentials = new NetworkCredential(FtpUser, FtpPass);
        FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(dirPath);
        listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
        listRequest.Credentials = credentials;
        using (FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse())
        using (Stream listStream = listResponse.GetResponseStream())
        using (StreamReader listReader = new StreamReader(listStream))
        {
            string fileToTest = Path.GetFileName(remoteAddress);
            while (!listReader.EndOfStream)
            {
                string fileName = listReader.ReadLine();
                fileName = Path.GetFileName(fileName);
                if (fileToTest == fileName)
                {
                    return true;
                }

            }
        }
        return false;
    }

    static void Main(string[] args)
    {
        bool existFile = ExistFile("ftp://123.456.789.12/test/config.json");
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/347897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档