Как генерировать случайный именованный текстовый файл в C#?

Внедрение зависимости является практикой, где объекты разработаны способом, где они получают экземпляры объектов от других частей кода, вместо того, чтобы создать их внутренне. Это означает, что в любом объекте, реализовывая интерфейс, который требуется объектом, можно заменить, не изменяя код, который упрощает тестирование и улучшает отделение.

, Например, рассмотрите эти классы:

public class PersonService {
  public void addManager( Person employee, Person newManager ) { ... }
  public void removeManager( Person employee, Person oldManager ) { ... }
  public Group getGroupByManager( Person manager ) { ... }
}

public class GroupMembershipService() {
  public void addPersonToGroup( Person person, Group group ) { ... }
  public void removePersonFromGroup( Person person, Group group ) { ... }
} 

В этом примере, для реализации PersonService::addManager и PersonService::removeManager был бы нужен экземпляр GroupMembershipService, чтобы сделать его работу. Без Внедрения зависимости традиционный способ сделать это состоял бы в том, чтобы инстанцировать нового GroupMembershipService в конструкторе PersonService лет и использовать тот атрибут экземпляра в обеих функциях. Однако, если у конструктора GroupMembershipService лет есть несколько вещей, это требует, или хуже все же, существует некоторая инициализация "методы set", которые нужно назвать на эти GroupMembershipService, код растет скорее быстро, и PersonService теперь зависит не только от GroupMembershipService, но также и все остальное, что GroupMembershipService зависит от. Кроме того, связь с [1 111] является hardcoded в PersonService, что означает, что Вы не можете "макет" GroupMembershipService для тестирования, или использовать стратегическую модель в различных частях Вашего приложения.

С Внедрением зависимости, вместо того, чтобы инстанцировать GroupMembershipService в Вашем PersonService, Вы или передали бы его в PersonService конструктор или иначе добавили бы Свойство (метод считывания и метод set) для установки локального экземпляра его. Это означает, что Ваш PersonService больше не должен волноваться о том, как создать GroupMembershipService, это просто принимает тех, это дано и работает с ними. Это также означает, что что-либо, что является подклассом [1 119], или реализует эти GroupMembershipService, интерфейс может быть "введен" в эти PersonService, и эти PersonService не должен знать об изменении.

6
задан Lady Sour 13 August 2009 в 07:41
поделиться

6 ответов

If you want to create the file names youself, put the characters that you want to use in a string and pick from that:

// selected characters
string chars = "2346789ABCDEFGHJKLMNPQRTUVWXYZabcdefghjkmnpqrtuvwxyz";
// create random generator
Random rnd = new Random();
string name;
do {
   // create name
   name = string.Empty;
   while (name.Length < 5) {
      name += chars.Substring(rnd.Next(chars.Length), 1);
   }
   // add extension
   name += ".txt";
   // check against files in the folder
} while (File.Exists(Path.Compbine(folderPath, name)))
7
ответ дан 8 December 2019 в 02:07
поделиться

Посмотрите на методы GetTempFileName и GetRandomFileName класса System.IO.Path .

  • GetRandomFileName создает "криптографически стойкое" имя файла и является тот, который ближе к тому, что вы просили.

  • GetTempFileName создает уникальное имя файла в каталоге, а также создает файл с нулевым байтом с этим именем, помогая обеспечить его уникальность. Это может быть ближе к тому, что вам действительно может понадобиться.

35
ответ дан 8 December 2019 в 02:07
поделиться

А как насчет методов Path.GetTempFileName () или Path.GetRandomFileName ()? Учтите также тот факт, что файловая система не является транзакционной и два параллельных процесса могут создавать файлы с одинаковыми именами. TempFileName () должен возвращать уникальное имя (по спецификации), поэтому «возможно» вам не нужно беспокоиться об этом, если временный каталог подходит для вашего решения.

3
ответ дан 8 December 2019 в 02:07
поделиться

Или вы можете использовать GUID для создания уникального имени файла:

Википедия:

Хотя каждый сгенерированный GUID не гарантированно уникальна, общая количество уникальных ключей (2 ^ 128 или 3,4 × 10 ^ 38) настолько велико, что вероятность того, что то же число generated twice is infinitesimally small.

string text = "Sample...";
string path = "D:\\Temp\\";

if (!path.EndsWith("\\"))
    path += "\\";

string filename = path + Guid.NewGuid().ToString() + ".txt";
while (File.Exists(filename))
    filename = path + Guid.NewGuid().ToString() + ".txt";

TextWriter writer = null;
try
{
    writer = new StreamWriter(filename);
    writer.WriteLine(text);
    writer.Close();
}
catch (Exception e)
{
    MessageBox.Show("Exception occured: " + e.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}
2
ответ дан 8 December 2019 в 02:07
поделиться

Часть кода, которая генерирует случайную строку (букв), была размещена здесь . Код, создающий файлы (также использующий случайные имена файлов), доступен здесь .

1
ответ дан 8 December 2019 в 02:07
поделиться

нашел это в Google для вас ( источник здесь ):

/// <summary>
/// Generates a random string with the given length
/// </summary>
/// <param name="size">Size of the string</param>
/// <param name="lowerCase">If true, generate lowercase string</param>
/// <returns>Random string</returns>
private string RandomString(int size, bool lowerCase)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch ;
for(int i=0; i<size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
builder.Append(ch); 
}
if(lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}

После этого используйте файловые потоки для создания и записи файла.

1
ответ дан 8 December 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: