я обычно делаю что-то вдоль этих линий:
- старт с именем файла (стволовой
work.dat1
, например)
- попытаться создать его с CreateNew
- , если это работает, вы получили файл, в противном случае ...
- перемешайте текущую дату/время в имя файла (например,
work.2011-01-15T112357.dat
)
- попытки создать файл
- Если это сработало, у вас есть файл, иначе ...
- Смешайте монотонный счетчик в имени файла (например,
work.2011-01-15T112357.0001.dat
. (Мне не нравятся GUID. Я предпочитаю порядок/предсказуемость.)
- попытаться создать файл. Продолжайте пометить счетчик и повторите попытку, пока файл не будет создан для вас.
Вот класс образец:
static class DirectoryInfoHelpers
{
public static FileStream CreateFileWithUniqueName(this DirectoryInfo dir , string rootName)
{
FileStream fs = dir.TryCreateFile(rootName) ; // try the simple name first
// if that didn't work, try mixing in the date/time
if (fs == null)
{
string date = DateTime.Now.ToString("yyyy-MM-ddTHHmmss") ;
string stem = Path.GetFileNameWithoutExtension(rootName) ;
string ext = Path.GetExtension(rootName) ?? ".dat" ;
ext = ext.Substring(1);
string fn = string.Format("{0}.{1}.{2}" , stem , date , ext) ;
fs = dir.TryCreateFile(fn) ;
// if mixing in the date/time didn't work, try a sequential search
if (fs == null)
{
int seq = 0 ;
do
{
fn = string.Format("{0}.{1}.{2:0000}.{3}" , stem , date , ++seq , ext) ;
fs = dir.TryCreateFile(fn) ;
} while (fs == null) ;
}
}
return fs ;
}
private static FileStream TryCreateFile(this DirectoryInfo dir , string fileName)
{
FileStream fs = null ;
try
{
string fqn = Path.Combine(dir.FullName , fileName) ;
fs = new FileStream(fqn , FileMode.CreateNew , FileAccess.ReadWrite , FileShare.None) ;
}
catch (Exception)
{
fs = null ;
}
return fs ;
}
}
Вы можете настроить алгоритм (всегда использовать все возможные компоненты к имени файла, например). Зависит от контекста. Если бы я, например, создавал файлы журналов, которые я мог бы повернуть из существования, вы бы хотели, чтобы все они делили один и тот же шаблон с именем.
Код не является идеальным (проверки данных, переданных, например, не производится). И алгоритм не идеален (если вы заполняете права на жесткий диск или разрешения на встречу, фактические ошибки ввода-вывода или другие ошибки файловой системы, например, это будет зависать, как он есть, в бесконечном цикле).
Мне нравится использовать Ticks как GUID действительно некрасиво. Вы также можете получить хэш Ticks, который уменьшает длину символа имени файла. 'DateTime.Now.Ticks.GetHashCode(). ToString (" x "). ToUpper()' – WillMcKill