Comment obtenir (facilement) un nom de fichier unique (pour un stockage temporaire) ?
Bonjour, Dans ce type de cas j'utilise la méthode suivante :
MD5 md5= new MD5CryptoServiceProvider(); System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Fichier etant un Stream.
Comme ça le nom de ton fichier est calculé à partir de son contenu et donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Pierre Alexis [MVP]
Salut Frédéric,
Tu as écrit :
Comment obtenir (facilement) un nom de fichier unique (pour un stockage temporaire) ?
Essaye de poster ton message dans un seul forum. Sinon ceux qui répondent ici, ne seront pas spécialement au courant des réponses apportées dans l'autre forum. Merci :-)
PS : j'ai répondu à ta question sur microsoft.public.fr.dotnet.vb.
Comment obtenir (facilement) un nom de fichier unique (pour un stockage
temporaire) ?
Essaye de poster ton message dans un seul forum. Sinon ceux qui répondent ici,
ne seront pas spécialement au courant des réponses apportées dans l'autre
forum. Merci :-)
PS : j'ai répondu à ta question sur microsoft.public.fr.dotnet.vb.
Comment obtenir (facilement) un nom de fichier unique (pour un stockage temporaire) ?
Essaye de poster ton message dans un seul forum. Sinon ceux qui répondent ici, ne seront pas spécialement au courant des réponses apportées dans l'autre forum. Merci :-)
PS : j'ai répondu à ta question sur microsoft.public.fr.dotnet.vb.
> > Comment obtenir (facilement) un nom de fichier unique (pour un stockage > temporaire) ? > Bonjour, Dans ce type de cas j'utilise la méthode suivante :
MD5 md5= new MD5CryptoServiceProvider(); System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Comme ça le nom de ton fichier est calculé à partir de son contenu et donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Ca me semble un peu compliqué, lourd et apportant moins de garantie qu'un truc du genre
Random rnd = new Random(); String nomFichier; do { nomFichier = rnd.Next().ToString() + ".tmp"; } while(File.Exists(nomFichier));
-- Vincent
> > Comment obtenir (facilement) un nom de fichier unique (pour un stockage
> temporaire) ?
>
Bonjour,
Dans ce type de cas j'utilise la méthode suivante :
MD5 md5= new MD5CryptoServiceProvider();
System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Comme ça le nom de ton fichier est calculé à partir de son contenu et
donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Ca me semble un peu compliqué, lourd et apportant moins de garantie qu'un
truc du genre
Random rnd = new Random();
String nomFichier;
do
{
nomFichier = rnd.Next().ToString() + ".tmp";
} while(File.Exists(nomFichier));
> > Comment obtenir (facilement) un nom de fichier unique (pour un stockage > temporaire) ? > Bonjour, Dans ce type de cas j'utilise la méthode suivante :
MD5 md5= new MD5CryptoServiceProvider(); System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Comme ça le nom de ton fichier est calculé à partir de son contenu et donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Ca me semble un peu compliqué, lourd et apportant moins de garantie qu'un truc du genre
Random rnd = new Random(); String nomFichier; do { nomFichier = rnd.Next().ToString() + ".tmp"; } while(File.Exists(nomFichier));
-- Vincent
Vincent Lascaux
> > Comme ça le nom de ton fichier est calculé à partir de son contenu et > donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Ca me semble un peu compliqué, lourd et apportant moins de garantie qu'un truc du genre
Remarques, tu as la garantie que ton algo termine, j'ai la garantie qu'il n'y a pas de collision de fichiers...
-- Vincent
> > Comme ça le nom de ton fichier est calculé à partir de son contenu et
> donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Ca me semble un peu compliqué, lourd et apportant moins de garantie qu'un
truc du genre
Remarques, tu as la garantie que ton algo termine, j'ai la garantie qu'il
n'y a pas de collision de fichiers...
> Comment obtenir (facilement) un nom de fichier unique (pour un stockage temporaire) ?
Pour ma part j'utilise une méthode de génération de nombres uniques au sein de l'application. Le nombre inclut une composante 'calendaire' afin de ne jamais se répeter dans le temps ainsi qu'une composante 'clé d'application' afin d'être certain qu'aucune de mes applications ne génère les mêmes nombres "uniques".
Attention cependant aux critères de sécurité: la priorité est ici de créer un nom de fichier unique et non 'aléatoire' bien que la probabilité de deviner le nombre final soit très basse. Il y a également la notion d' accès concurrents à gèrer mais c'est déjà un début...
--------------------------------------------------------------------- Class IDGenerator
Private Shared Const currID As Long = 0
Public Shared Function GetUniqueID() As Long Dim tmpId as Long = currID While(tmpId = currID) currID = Convert.ToInt64(DateTime.Now.ToString("yyMMddHHmmssfff" & GlobalVars.ApplicationKey)); End While Return(currID) End Function
End Class ---------------------------------------------------------------------
.antoine
> Comment obtenir (facilement) un nom de fichier unique (pour un stockage
temporaire) ?
Pour ma part j'utilise une méthode de génération de nombres uniques
au sein de l'application. Le nombre inclut une composante 'calendaire'
afin de ne jamais se répeter dans le temps ainsi qu'une composante
'clé d'application' afin d'être certain qu'aucune de mes applications ne
génère les mêmes nombres "uniques".
Attention cependant aux critères de sécurité: la priorité est ici de créer
un nom de fichier unique et non 'aléatoire' bien que la probabilité de
deviner le nombre final soit très basse. Il y a également la notion d'
accès concurrents à gèrer mais c'est déjà un début...
---------------------------------------------------------------------
Class IDGenerator
Private Shared Const currID As Long = 0
Public Shared Function GetUniqueID() As Long
Dim tmpId as Long = currID
While(tmpId = currID)
currID = Convert.ToInt64(DateTime.Now.ToString("yyMMddHHmmssfff" & GlobalVars.ApplicationKey));
End While
Return(currID)
End Function
End Class
---------------------------------------------------------------------
> Comment obtenir (facilement) un nom de fichier unique (pour un stockage temporaire) ?
Pour ma part j'utilise une méthode de génération de nombres uniques au sein de l'application. Le nombre inclut une composante 'calendaire' afin de ne jamais se répeter dans le temps ainsi qu'une composante 'clé d'application' afin d'être certain qu'aucune de mes applications ne génère les mêmes nombres "uniques".
Attention cependant aux critères de sécurité: la priorité est ici de créer un nom de fichier unique et non 'aléatoire' bien que la probabilité de deviner le nombre final soit très basse. Il y a également la notion d' accès concurrents à gèrer mais c'est déjà un début...
--------------------------------------------------------------------- Class IDGenerator
Private Shared Const currID As Long = 0
Public Shared Function GetUniqueID() As Long Dim tmpId as Long = currID While(tmpId = currID) currID = Convert.ToInt64(DateTime.Now.ToString("yyMMddHHmmssfff" & GlobalVars.ApplicationKey)); End While Return(currID) End Function
End Class ---------------------------------------------------------------------
.antoine
Pierre Alexis [MVP]
Salut Vincent,
Tu as écrit :
Remarques, tu as la garantie que ton algo termine, j'ai la garantie qu'il n'y a pas de collision de fichiers...
Nullement ! Et si je lance x fois le programme en même temps ? Et si j'ai déjà un fichier portant malancontreusement le nom trouvé par la fonction RND ?
Remarques, tu as la garantie que ton algo termine, j'ai la garantie qu'il
n'y a pas de collision de fichiers...
Nullement ! Et si je lance x fois le programme en même temps ? Et si j'ai déjà
un fichier portant malancontreusement le nom trouvé par la fonction RND ?
Remarques, tu as la garantie que ton algo termine, j'ai la garantie qu'il n'y a pas de collision de fichiers...
Nullement ! Et si je lance x fois le programme en même temps ? Et si j'ai déjà un fichier portant malancontreusement le nom trouvé par la fonction RND ?
MD5 md5= new MD5CryptoServiceProvider(); System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Fichier etant un Stream.
Comme ça le nom de ton fichier est calculé à partir de son contenu et donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Comment peut-on faire un hash d'un fichier qui n'exsite pas ? :-p Et puis inutile de d'aller charger tout le contenu d'un fichier (imagine que celui-fasse plusieurs Gigas, t'en as pour un bout de temps avec tous les accès disque). Ici on veut simplement trouver un nom de fichier qui n'existe pas encore, rien de plus... ;-)
MD5 md5= new MD5CryptoServiceProvider();
System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Fichier etant un Stream.
Comme ça le nom de ton fichier est calculé à partir de son contenu et
donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Comment peut-on faire un hash d'un fichier qui n'exsite pas ? :-p Et puis
inutile de d'aller charger tout le contenu d'un fichier (imagine que
celui-fasse plusieurs Gigas, t'en as pour un bout de temps avec tous les accès
disque). Ici on veut simplement trouver un nom de fichier qui n'existe pas
encore, rien de plus... ;-)
MD5 md5= new MD5CryptoServiceProvider(); System.Guid g= new system.Guid((System.Byte[])md5.ComputeHash(Fichier));
nomFichier=g.ToString()+"."+extensionFichier;
Fichier etant un Stream.
Comme ça le nom de ton fichier est calculé à partir de son contenu et donc le nom est unique (sauf si 2 fichiers sont parfaitement identiques)
Comment peut-on faire un hash d'un fichier qui n'exsite pas ? :-p Et puis inutile de d'aller charger tout le contenu d'un fichier (imagine que celui-fasse plusieurs Gigas, t'en as pour un bout de temps avec tous les accès disque). Ici on veut simplement trouver un nom de fichier qui n'existe pas encore, rien de plus... ;-)
> Nullement ! Et si je lance x fois le programme en même temps ? Et si j'ai
déjà
Il peut effectivement y avoir un probleme si deux instances du programmes trouvent en même temps que le fichier est inexistant, et veulent le créer toutes les deux. Je me demande si le même probleme arrive lorsqu'on demande un nom de fichier temporaire avec le framework (mais ca doit etre assez compliqué à tester, parceque s'il utilise aussi des nombres aléatoire (ce qui me semble assez probable), le probleme ne doit pas apparaitre souvent. Pour etre sur il faudrait avoir acces au code source de la fonction Path.GetTempFileName()) Dans ce cas, il faudrait remplacer par (désolé, pas le temps de regarder le nom de la vraie exception)
bool createNomFichier(String fichier) { try { //creation et remplissage du fichier return true; } catch(FichierDejaExistant) { return false; } }
Random rnd = new Random(); String nomFichier; do { nomFichier = rnd.Next().ToString() + ".tmp"; } while(!create(nomFichier));
un fichier portant malancontreusement le nom trouvé par la fonction RND ?
Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un autre nombre à RND
-- Vincent
> Nullement ! Et si je lance x fois le programme en même temps ? Et si j'ai
déjà
Il peut effectivement y avoir un probleme si deux instances du programmes
trouvent en même temps que le fichier est inexistant, et veulent le créer
toutes les deux. Je me demande si le même probleme arrive lorsqu'on demande
un nom de fichier temporaire avec le framework (mais ca doit etre assez
compliqué à tester, parceque s'il utilise aussi des nombres aléatoire (ce
qui me semble assez probable), le probleme ne doit pas apparaitre souvent.
Pour etre sur il faudrait avoir acces au code source de la fonction
Path.GetTempFileName())
Dans ce cas, il faudrait remplacer par (désolé, pas le temps de regarder le
nom de la vraie exception)
bool createNomFichier(String fichier)
{
try
{
//creation et remplissage du fichier
return true;
} catch(FichierDejaExistant) {
return false;
}
}
Random rnd = new Random();
String nomFichier;
do
{
nomFichier = rnd.Next().ToString() + ".tmp";
} while(!create(nomFichier));
un fichier portant malancontreusement le nom trouvé par la fonction RND ?
Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un autre
nombre à RND
> Nullement ! Et si je lance x fois le programme en même temps ? Et si j'ai
déjà
Il peut effectivement y avoir un probleme si deux instances du programmes trouvent en même temps que le fichier est inexistant, et veulent le créer toutes les deux. Je me demande si le même probleme arrive lorsqu'on demande un nom de fichier temporaire avec le framework (mais ca doit etre assez compliqué à tester, parceque s'il utilise aussi des nombres aléatoire (ce qui me semble assez probable), le probleme ne doit pas apparaitre souvent. Pour etre sur il faudrait avoir acces au code source de la fonction Path.GetTempFileName()) Dans ce cas, il faudrait remplacer par (désolé, pas le temps de regarder le nom de la vraie exception)
bool createNomFichier(String fichier) { try { //creation et remplissage du fichier return true; } catch(FichierDejaExistant) { return false; } }
Random rnd = new Random(); String nomFichier; do { nomFichier = rnd.Next().ToString() + ".tmp"; } while(!create(nomFichier));
un fichier portant malancontreusement le nom trouvé par la fonction RND ?
Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un autre nombre à RND
-- Vincent
Pierre Alexis [MVP]
Salut Vincent,
Tu as écrit :
Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un autre nombre à RND
Les programmeurs de Microsoft n'étant pas totalement crétins, à mon avis ils font de même ;-)