13 messaggi dal 17 dicembre 2005
Per controllare se una cartella FTP esiste su server ho utilizzato una funzione come qui descritto: http://stackoverflow.com/questions/2769137/how-to-check-if-an-ftp-directory-exists
public bool FtpDirectoryExists(string directoryPath, string ftpUser, string ftpPassword)
        {
            bool IsExists = true;
            try
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(directoryPath);
                request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;

                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                IsExists = false;
            }
            return IsExists;
        }

Non sarà elegante, ma ha sempre funzionato bene.
Oggi mi sono accorto però che su un nuovo progetto non funziona più nel senso che la funzione dice che la cartella esiste anche se in realtà non esiste.
Ho fatto qualche prova e sembra che con il .NET 3.5 funziona bene ma con il .NET 4.0 non funziona più.

Esiste un metodo alternativo per controllare se una cartella esiste?
Modificato da micvic il 18 novembre 2013 10.28 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

micvic ha scritto:

dice che la cartella esiste anche se in realtà non esiste.

già... qui il problema è che l'FtpWebRequest probabilmente non prova a spostarsi nella cartella che gli passi, ma invece usa la root dell'utente FTP come cartella di lavoro. Ovviamente la root esiste, ed ecco perché quel codice ti restituisce sempre lo stesso esito.

Purtroppo penso che la classe FtpWebRequest non sia molto affidabile per il tuo scopo. Stranamente non supporta neanche il comando CWD che ti consentirebbe di capire facilmente se la cartella esiste o meno.

Prova invece ad usare la libreria FtpClient che trovi su Nuget; ha un apposito metodo DirectoryExists. Ecco il codice di esempio:

public static bool? FtpDirectoryExists(string host, string directoryPath, string ftpUser, string ftpPassword)
{
    var client = new FtpClient { Host = host, Credentials = new NetworkCredential(ftpUser, ftpPassword) };
    try
    {
        //mi collego e restituisco l'esito
        client.Connect();
        return client.DirectoryExists(directoryPath);
    }
    catch
    {
        //Si sono verificati errori di connessione e dunque non sono stato in grado di determinare l'esistenza della cartella
        return null;
    }
    finally
    {
        client.Dispose();
    }
}

La usi cosi:
var dirExists = FtpDirectoryExists("ftp.example.com", "/percorso/cartella", "nomeutente", "password");

Nota che ho cambiato il valore di ritorno da bool a bool? perché la funzione deve poter restituire un esito indeterminato quando non riesce a collegarsi per varie cause (server irraggiungibile, servizio fermo, password cambiata, ecc...).
Quando il valore di ritorno è null, dovrai decidere se fare dei tentativi ulteriori dopo un certo tempo di attesa o abortire del tutto la procedura.

ciao,
Moreno.
Modificato da BrightSoul il 22 novembre 2013 15.12 -

Enjoy learning and just keep making
13 messaggi dal 17 dicembre 2005
Grazie BrightSoul!
Proverò la libreria e i tuoi suggerimenti al più presto.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.