C# 下载文件之前,请检查ftp服务器上是否存在该文件

C# 下载文件之前,请检查ftp服务器上是否存在该文件,c#,C#,在从ftp服务器下载一个文件之前,我想检查它是否存在,如果不存在的话 st抛出异常。该代码示例在文件不存在时工作。但是,当文件存在时,在执行该行之后;“ftpRequest.Method=WebRequestMethods.Ftp.DownloadFile;”它跳过第二个catch块并打印“错误:在提交请求后无法执行此操作。”我看不到的是什么……感谢您的回答 public void fileDownload(string fileName) { strea

在从ftp服务器下载一个文件之前,我想检查它是否存在,如果不存在的话 st抛出异常。该代码示例在文件不存在时工作。但是,当文件存在时,在执行该行之后;“ftpRequest.Method=WebRequestMethods.Ftp.DownloadFile;”它跳过第二个catch块并打印“错误:在提交请求后无法执行此操作。”我看不到的是什么……感谢您的回答

public void fileDownload(string fileName)
        {
            stream = new FileStream(filePath + fileName, FileMode.Create);
            ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath + fileName));
            ftpRequest.Credentials = new NetworkCredential(userName, password);
            ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;

            try
            {
                response = (FtpWebResponse)ftpRequest.GetResponse();
                ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpRequest.UseBinary = true;
                response = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = response.GetResponseStream();
                cl = response.ContentLength;
                bufferSize = 2048;
                buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);

                while (readCount > 0)
                {
                    stream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }

                ftpStream.Close();
                stream.Close();
                response.Close();
                Console.WriteLine("File : " + fileName + " is downloaded from ftp server"); 
            }
            catch (WebException ex)
            {
                 FtpWebResponse res = (FtpWebResponse)ex.Response;
                 if (res.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                 {
                     stream.Close();
                     File.Delete(filePath + fileName);
                     Console.WriteLine("File : " + fileName + " does not exists on ftp server");
                     System.Diagnostics.Debug.WriteLine("Error: " + fileName + " is not available on fpt server");
                 }
            }   
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Error: " + ex.Message);
            }
        }

我的理解是,您必须为每个请求创建一个新的
FtpWebRequest
。因此,在再次设置
方法之前,您必须创建一个新方法并再次设置凭据。因此,您必须重复以下两行:

ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath + fileName));
ftpRequest.Credentials = new NetworkCredential(userName, password);

连接到FTP服务器时,可以将Uri指定为“FTP//FTP.domain.com/somedirectory”,但这会转换为:ftp://ftp.domain.com/homedirectoryforftp/somedirectory". 要定义完整的根目录,请使用“ftp://ftp.domain.com//somedirectory“这将转换为机器上的//somedirectory。

是的,你说得对。我通过编写fileExist()方法来处理它,以避免重复相同的行。感谢answerI,它成功了。我遇到了同样的错误:“请求提交后无法执行此操作。”我试图下载一个文件,然后重新上传另一个文件,重复使用相同的请求对象。将它们拆分为单独的请求对象就可以实现这一点。谢谢