Почему бы просто не использовать что-то подобное и не переходить в циклы, пока вы не сможете создать файл без конфликта?
const string ValidChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static string GenerateName(Random random, int length)
{
char[] chars = new char[length];
for (int i=0; i < length; i++)
{
chars[i] = ValidChars[random.Next(ValidChars.Length)];
}
return new string(chars);
}
Причина передачи в RNG состоит в том, чтобы избежать типичных проблем создания нового RNG в методе (дубликаты при вызове в быстрой последовательности) без использования статического RNG (который не является потокобезопасным).
Альтернативой может быть наличие одного статического RNG только для чтения и сериализация вызовов в пределах GenerateName
путем блокировки.
Суть в том, что как-то вы генерируете случайное имя, и вы просто продолжаете пытаться создавать файлы со случайными именами, пока не добьетесь успеха, что, вероятно, произойдет очень быстро (12 символов [AZ 0- 9] дает 4 738 381 338 321 616 896 возможных комбинаций).