Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Obtenir un non de fichier temporaire

13 réponses
Avatar
Frédéric LAMBOUR
Comment obtenir (facilement) un nom de fichier unique (pour un stockage
temporaire) ?

10 réponses

1 2
Avatar
Michael Costes
Frédéric LAMBOUR wrote:
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)
Avatar
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.

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Vincent Lascaux
> > 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
Avatar
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
Avatar
Zoury
autant utilisé Path.GetTempFileName()..

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic classique
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Antoine F.
> 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
Avatar
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 ?

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Pierre Alexis [MVP]
Salut Michael,

Tu as écrit :

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... ;-)

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Vincent Lascaux
> 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
Avatar
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 ;-)

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
1 2