Domanda

Devo usare FtpWebRequest per mettere un file in una directory FTP. Prima del caricamento, vorrei prima sapere se questo file esiste.

Quale metodo o proprietà dovrei usare per verificare se questo file esiste?

È stato utile?

Soluzione

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
    }
}

Come regola generale è una cattiva idea usare Eccezioni per funzionalità nel tuo codice come questa, tuttavia in questo caso credo sia una vittoria per il pragmatismo. L'elenco delle chiamate nella directory ha il potenziale per essere molto più inefficiente rispetto all'utilizzo delle eccezioni in questo modo.

Se non lo sei, tieni presente che non è una buona pratica!

EDIT: " Funziona per me! "

Questo sembra funzionare sulla maggior parte dei server ftp ma non su tutti. Alcuni server richiedono l'invio di " TIPO I " prima che il comando SIZE funzioni. Si sarebbe pensato che il problema dovesse essere risolto come segue:

request.UseBinary = true;

Sfortunatamente è una limitazione di progettazione (grosso errore!) che a meno che FtpWebRequest non stia scaricando o caricando un file NON invierà "TIPO I". Vedi la discussione e la risposta Microsoft qui .

Raccomanderei invece di utilizzare il seguente WebRequestMethod, questo funziona per me su tutti i server che ho testato, anche su quelli che non restituiscono una dimensione del file.

WebRequestMethods.Ftp.GetDateTimestamp

Altri suggerimenti

A causa

request.Method = WebRequestMethods.Ftp.GetFileSize

potrebbe non riuscire in alcuni casi (550: SIZE non consentito in modalità ASCII), puoi semplicemente controllare Timestamp invece.

reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password);
reqFTP.UseBinary = true;
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;

FtpWebRequest (né qualsiasi altra classe in .NET) non ha alcun metodo esplicito per controllare l'esistenza di un file. Devi abusare di una richiesta come GetFileSize o 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);
    }
}

Se si desidera un codice più semplice, utilizzare una libreria FTP di terze parti.

Ad esempio con WinSCP .NET assembly , puoi usare il suo Metodo 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");
}

(sono l'autore di WinSCP)

Uso FTPStatusCode.FileActionOK per verificare se il file esiste ...

quindi, in " else " sezione, restituisce false.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top