ftpwebrequest 전에 FTP에 파일이 있는지 확인하는 방법
-
20-08-2019 - |
문제
사용해야합니다 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 서버에서 작동하는 것으로 보이지만 전부는 아닙니다. 일부 서버는 크기 명령이 작동하기 전에 "유형 I"을 보내야합니다. 문제는 다음과 같이 해결되어야한다고 생각했을 것입니다.
request.UseBinary = true;
불행히도 FTPWebRequest가 파일을 다운로드하거나 업로드하지 않는 한 "Type I"을 보내지 않는다는 것은 설계 제한 (Big Fat Bug!)입니다. 토론 및 Microsoft 응답을 참조하십시오 여기.
대신 다음 WebRequestMethod를 사용하는 것이 좋습니다. 테스트 한 모든 서버, 심지어 파일 크기를 반환하지 않는 서버에서도 작동합니다.
WebRequestMethods.Ftp.GetDateTimestamp
다른 팁
왜냐하면
request.Method = WebRequestMethods.Ftp.GetFileSize
어떤 경우에는 실패 할 수 있습니다 (550 : ASCII 모드에서는 크기가 허용되지 않음) 대신 타임 스탬프 만 확인할 수 있습니다.
reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password);
reqFTP.UseBinary = true;
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebRequest
(또는 .NET의 다른 클래스)에는 파일 존재를 확인할 명시적인 방법이 없습니다. 요청과 같은 요청을 남용해야합니다 GetFileSize
또는 GetDateTimestamp
.
string url = "ftp://ftp.example.com/remote/path/file.txt";
WebRequest request = WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.GetFileSize;
try
{
request.GetResponse();
Console.WriteLine("Exists");
}
catch (WebException e)
{
FtpWebResponse response = (FtpWebResponse)e.Response;
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
Console.WriteLine("Does not exist");
}
else
{
Console.WriteLine("Error: " + e.Message);
}
}
보다 간단한 코드를 원한다면 일부 타사 FTP 라이브러리를 사용하십시오.
예를 들어 WinSCP .NET 어셈블리, 당신은 그것을 사용할 수 있습니다 Session.FileExists
방법:
SessionOptions sessionOptions = new SessionOptions {
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
};
Session session = new Session();
session.Open(sessionOptions);
if (session.FileExists("/remote/path/file.txt"))
{
Console.WriteLine("Exists");
}
else
{
Console.WriteLine("Does not exist");
}
(저는 WinSCP의 저자입니다)
ftpstatuscode.fileActionok을 사용하여 파일이 있는지 확인합니다 ...
그런 다음 "else"섹션에서 false를 반환하십시오.