Question

Je dois utiliser FtpWebRequest pour placer un fichier dans un répertoire FTP. Avant le téléchargement, j'aimerais tout d'abord savoir si ce fichier existe.

Quelle méthode ou propriété dois-je utiliser pour vérifier si ce fichier existe?

Était-ce utile?

La solution

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

En règle générale, c'est une mauvaise idée d'utiliser Exceptions pour les fonctionnalités de votre code comme celle-ci, mais dans ce cas, je pense que c'est une victoire pour le pragmatisme. La liste d'appels de l'annuaire risque d'être beaucoup plus inefficace que d'utiliser des exceptions de cette manière.

Si vous ne l'êtes pas, sachez que ce n'est pas une bonne pratique!

EDIT: "Cela fonctionne pour moi!"

Cela semble fonctionner sur la plupart des serveurs ftp mais pas tous. Certains serveurs requièrent l’envoi de "TYPE I". avant que la commande SIZE ne fonctionne. On aurait pu penser que le problème devrait être résolu comme suit:

request.UseBinary = true;

Malheureusement, la limitation de la conception (gros problème!) est que, sauf si FtpWebRequest télécharge ou télécharge un fichier, il n'enverra PAS le "TYPE I". Voir la discussion et la réponse de Microsoft ici. .

Je vous recommanderais plutôt d'utiliser la méthode WebRequestMethod suivante, cela fonctionne pour moi sur tous les serveurs que j'ai testés, même ceux qui ne renverraient pas une taille de fichier.

WebRequestMethods.Ftp.GetDateTimestamp

Autres conseils

Parce que

request.Method = WebRequestMethods.Ftp.GetFileSize

peut échouer dans certains cas (550: la taille n'est pas autorisée en mode ASCII), vous pouvez simplement vérifier l'horodatage à la place.

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

FtpWebRequest (ni aucune autre classe de .NET) ne dispose d'aucune méthode explicite pour vérifier l'existence d'un fichier. Vous devez abuser d'une requête telle que GetFileSize ou 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);
    }
}

Si vous souhaitez un code plus simple, utilisez une bibliothèque FTP tierce.

Par exemple, avec assemblage WinSCP .NET , vous pouvez utiliser son Méthode 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");
}

(je suis l'auteur de WinSCP)

J'utilise FTPStatusCode.FileActionOK pour vérifier si le fichier existe ...

alors, dans le champ "else" section, retourne false.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top