J'ai besoin d'utiliser FtpWebRequest
pour placer un fichier dans un répertoire FTP. Avant le téléchargement, je voudrais d'abord savoir si ce fichier existe.
Quelle méthode ou propriété dois-je utiliser pour vérifier si ce fichier existe ?
J'ai besoin d'utiliser FtpWebRequest
pour placer un fichier dans un répertoire FTP. Avant le téléchargement, je voudrais d'abord savoir si ce fichier existe.
Quelle méthode ou propriété dois-je utiliser pour vérifier si ce fichier existe ?
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 des exceptions pour des fonctionnalités dans un code comme celui-ci, mais dans ce cas, je pense que c'est une victoire pour le pragmatisme. Appeler list dans le répertoire pourrait être beaucoup plus inefficace que d'utiliser des exceptions de cette façon.
Si vous ne l'êtes pas, sachez simplement que ce n'est pas une bonne pratique !
EDIT : "Ça marche pour moi !"
Cela semble fonctionner sur la plupart des serveurs ftp, mais pas tous. Certains serveurs exigent l'envoi de "TYPE I" avant que la commande SIZE ne fonctionne. On aurait pu penser que le problème devrait être résolu de la manière suivante :
request.UseBinary = true;
Malheureusement, en raison d'une limitation de conception (un gros bogue !), à moins que FtpWebRequest ne soit en train de télécharger ou d'envoyer un fichier, il n'enverra PAS de "TYPE I". Voir la discussion et la réponse de Microsoft aquí .
Je vous recommande d'utiliser la méthode WebRequestMethod suivante à la place, qui fonctionne pour moi sur tous les serveurs que j'ai testés, même ceux qui ne renvoient pas de taille de fichier.
WebRequestMethods.Ftp.GetDateTimestamp
Parce que
request.Method = WebRequestMethods.Ftp.GetFileSize
peut échouer dans certains cas (550 : SIZE not allowed in ASCII mode), vous pouvez simplement vérifier Timestamp à 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) n'a pas de méthode explicite pour vérifier l'existence d'un fichier sur le serveur FTP. Vous devez abuser d'une requête comme 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);
}
}
Si vous souhaitez un code plus simple, utilisez une bibliothèque FTP tierce.
Par exemple avec Assemblage WinSCP .NET vous pouvez utiliser son Session.FileExists
méthode :
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)
Vous pouvez utiliser WebRequestMethods.Ftp.ListDirectory
pour vérifier si un fichier existe, sans avoir besoin du méchant mécanisme try catch.
private static bool ExistFile(string remoteAddress)
{
int pos = remoteAddress.LastIndexOf('/');
string dirPath = remoteAddress.Substring(0, pos); // skip the filename only get the directory
NetworkCredential credentials = new NetworkCredential(FtpUser, FtpPass);
FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(dirPath);
listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
listRequest.Credentials = credentials;
using (FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse())
using (Stream listStream = listResponse.GetResponseStream())
using (StreamReader listReader = new StreamReader(listStream))
{
string fileToTest = Path.GetFileName(remoteAddress);
while (!listReader.EndOfStream)
{
string fileName = listReader.ReadLine();
fileName = Path.GetFileName(fileName);
if (fileToTest == fileName)
{
return true;
}
}
}
return false;
}
static void Main(string[] args)
{
bool existFile = ExistFile("ftp://123.456.789.12/test/config.json");
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.