문제

사용해야합니다 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를 반환하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top