Jak sprawdzić czy plik istnieje na serwerze FTP?

Jak w C# i .NET sprawdzić czy plik istnieje na serwerze przed wrzuceniem go tam?

  • Można jeszcze spróbować wylistować zawartość katalogu, przetworzyć strumień tekstowy w odpowiedzi (w każdym wierszu znajduję się jeden plik/katalog) i sprawdzać czy aktualnie przetwarzana nazwa zgadza się z aktualną. Poniższy kod pozwoli na realizację tej funkcjonalności (należy go troszkę uzupełnić:)) Niestety obiekt FtpWebRequest, działa zgoła odmiennie na serwerach FTP postawionych na różnych systemach. Przykładowo jeśli dla Unixa, w uri znajdować się będą kropki oznaczające przejście do wyższego katalogu, to zostaną one pominięte (należy je zastąpić znakiem ucieczki %2e . Podobnie, jeśli podczas listowania katalogu, nie będzie w nim żadnych elementów, to na serwerze Unixowym otrzymamy wyjątek. Możemy go przechwycić i wtedy traktować tą sytuację, że nie ma pliku szukanego.

    FtpWebRequest oFtpWebRequest = null;
    FtpWebResponse oFtpWebResponse = null;
    StreamReader oStreamReader = null;
    try
    {
        string sLine = string.Empty;
        string sFileName = "plik.txt";
        oFtpWebRequest = CreateFtpWebRequestObject("KatalogNaFtp", true,
            WebRequestMethods.Ftp.ListDirectory);
        oFtpWebResponse = (FtpWebResponse)oFtpWebRequest.GetResponse();
        oStreamReader = new StreamReader(oFtpWebResponse.GetResponseStream(), 
            System.Text.Encoding.UTF8);
        while (null != (sLine = oStreamReader.ReadLine()))
        {
            if (sFileName.Equals(sLine.Trim(), StringComparison.CurrentCultureIgnoreCase))
            {
                // znaleziony
            }
        }
    }
    catch(Exception)
    {
        // przechwycić wyjątki
    }
    finally
    {
        // zamykamy wszystkie obiekty jeśli nie są nullami
    }
    
    ....
    
    // metoda do tworzenia obiektu FtpWebRequest
    private FtpWebRequest CreateFtpWebRequestObject(string sUri,
                bool bIsAlive, string sMethod)
    {
        FtpWebRequest oFtpWebRequest = null;
        oFtpWebRequest = (FtpWebRequest)WebRequest.Create(sUri));
        oFtpWebRequest.KeepAlive = bIsAlive;
        oFtpWebRequest.Method = sMethod;
        return oFtpWebRequest;
    }
    

  • Jakoś tak, uprzedzam, z głowy na sucho pisane więc mogą być bzdury, sprawdź.

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(fileUri);
    request.Method = WebRequestMethods.Ftp.GetFileSize;
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    // sprawdź zawartość response.StatusCode, nie pamiętam co będzie jak pliku nie ma ale możesz sobie po tym sprawdzić
    

Zaloguj się, aby dodać swoją odpowiedź