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

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

推荐答案

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命令才能工作.人们会认为这个问题应该通过以下方式解决:

request.UseBinary = true;

不幸的是,这是一个设计限制(大错误!)除非FtpWebRequest正在下载或上传文件,否则它不会发送"type I".请参阅讨论和Microsoft Response here.

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

WebRequestMethods.Ftp.GetDateTimestamp

.net相关问答推荐

使用PowerShell在Windows容器内安装exe

无法对.NET MAUI类库进行单元测试

NuGet 兼容与计算框架(Xamarin 和 .NET 6)

在数据网格中:如何在更改单元格 A 中的值后显示单元格 B 中的更改

查询 MongoDb 中嵌入式文档中的一个字段,该字段抛出调用运算符的左侧必须是对持久属性的直接访问

如何在 Windows 窗体上显示 ClickOnce 版本号

查找所有源硬编码字符串

即时窗口中的动态导致Microsoft.CSharp.RuntimeBinder.Binder未定义或导入错误

设置日志(log)文件名以在 Log4j 中包含当前日期

属性应该与其类型同名吗?

C# 相当于 Java 的 <?在泛型中扩展 Base>

什么是 Hashtable 的通用版本?

何时使用抽象类?

dotnet 恢复警告 NU1701

如何将 WebResponse.GetResponseStream 返回转换为字符串?

C# List<> 按 x 然后 y 排序

安装带有恢复操作的 Windows 服务以重新启动

使用 C# vs F# 或 F# vs C# 有什么好处?

MVVM 没有意义吗?

System.ServiceModel 在 .NET Core 项目中找不到