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
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
nombre à RND
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
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
nombre à RND
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
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
nombre à RND
> > 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;
> }
> }
Le problème est que sous .NET, il n'y a pas de méthode permettant de créer
un fichier et levant une exception si ce fichier existe déjà.
> 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
?
>
> Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un
autre
> nombre à RND
Si vous faîtes quelque chose du genre :
while (File.Exists( nomFichier))
GenérerNouveauNom();
CreerLeFichier();
Vous ne faîtes pas d'opération atomique : entre le moment où vous testez
l'existence du fichier et le moment où vous le créez, il peut se passer
beaucoup de choses.
Cependant, votre méthode est utilisable en la modifiant légèrement : au
d'utiliser la classe Random, vous utilisez la classe
RNGCryptoServiceProvider, vous génèrez une bonne quantité de bits
aléatoirement (128 devrait être suffisant), vous encodez le résultat de la
génèration dans une string ne contenant que des caractères acceptés par le
système de fichier (une manipulation utilisant un codage base64 par
et vous avez un nom de fichier presque garanti unique. Cependant la
probabilité que le fichier existe déjà ou qu'une autre application génère
même nombre est quasiment nulle.
> > 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;
> }
> }
Le problème est que sous .NET, il n'y a pas de méthode permettant de créer
un fichier et levant une exception si ce fichier existe déjà.
> 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
?
>
> Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un
autre
> nombre à RND
Si vous faîtes quelque chose du genre :
while (File.Exists( nomFichier))
GenérerNouveauNom();
CreerLeFichier();
Vous ne faîtes pas d'opération atomique : entre le moment où vous testez
l'existence du fichier et le moment où vous le créez, il peut se passer
beaucoup de choses.
Cependant, votre méthode est utilisable en la modifiant légèrement : au
d'utiliser la classe Random, vous utilisez la classe
RNGCryptoServiceProvider, vous génèrez une bonne quantité de bits
aléatoirement (128 devrait être suffisant), vous encodez le résultat de la
génèration dans une string ne contenant que des caractères acceptés par le
système de fichier (une manipulation utilisant un codage base64 par
et vous avez un nom de fichier presque garanti unique. Cependant la
probabilité que le fichier existe déjà ou qu'une autre application génère
même nombre est quasiment nulle.
> > 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;
> }
> }
Le problème est que sous .NET, il n'y a pas de méthode permettant de créer
un fichier et levant une exception si ce fichier existe déjà.
> 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
?
>
> Dans ce cas, File.Exists(nomFichier) retourne true, et on redemande un
autre
> nombre à RND
Si vous faîtes quelque chose du genre :
while (File.Exists( nomFichier))
GenérerNouveauNom();
CreerLeFichier();
Vous ne faîtes pas d'opération atomique : entre le moment où vous testez
l'existence du fichier et le moment où vous le créez, il peut se passer
beaucoup de choses.
Cependant, votre méthode est utilisable en la modifiant légèrement : au
d'utiliser la classe Random, vous utilisez la classe
RNGCryptoServiceProvider, vous génèrez une bonne quantité de bits
aléatoirement (128 devrait être suffisant), vous encodez le résultat de la
génèration dans une string ne contenant que des caractères acceptés par le
système de fichier (une manipulation utilisant un codage base64 par
et vous avez un nom de fichier presque garanti unique. Cependant la
probabilité que le fichier existe déjà ou qu'une autre application génère
même nombre est quasiment nulle.
> Le problème est que sous .NET, il n'y a pas de méthode permettant de
> un fichier et levant une exception si ce fichier existe déjà.
IOException An I/O error occurs, such as specifying
and the file specified by path already exists.
Je vois pas en quoi l'utilisation d'un truc de crypto garantie plus
l'unicité qu'un random.
> Le problème est que sous .NET, il n'y a pas de méthode permettant de
> un fichier et levant une exception si ce fichier existe déjà.
IOException An I/O error occurs, such as specifying
and the file specified by path already exists.
Je vois pas en quoi l'utilisation d'un truc de crypto garantie plus
l'unicité qu'un random.
> Le problème est que sous .NET, il n'y a pas de méthode permettant de
> un fichier et levant une exception si ce fichier existe déjà.
IOException An I/O error occurs, such as specifying
and the file specified by path already exists.
Je vois pas en quoi l'utilisation d'un truc de crypto garantie plus
l'unicité qu'un random.