2009-08-13 167 views
6

我必须做一个循环来生成一个5随机选取的字符串,然后在该名称下创建一个文本文件,可以说在C://中,我该​​怎么做?生成名称和在目录中创建文件。我想我必须从ascii代码中选择5个随机数字,然后将它们转换为相应的字符,以便能够将它用作名称。 Idk我会如何将他们转换成角色并与他们组成一串,你能帮我吗?如何在C#中生成随机命名的文本文件?

+0

,我肯定会用Orens答案去,因为你最终可能会遇到各种非法的文件路径字符 – ThePower 2009-08-13 09:57:38

回答

6

如果你要创建的文件名youself,把你想要在一个字符串使用,并从挑选角色:

// 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))) 
+0

为什么downvote?如果你不解释你认为什么是错的,它不能改善答案。 – Guffa 2015-04-12 09:14:13

35

查看System.IO.Path类的GetTempFileName和GetRandomFileName方法。

  • GetRandomFileName创造了一个“保密性强”的文件名,并且是一个更接近你问什么。

  • GetTempFileName在目录中创建一个唯一的文件名 - 也创建一个名称为零的零字节文件 - 有助于确保其唯一性。这可能更接近你实际需要的东西。

+0

+1正是我刚才要回答的:-) – galaktor 2009-08-13 07:58:17

1

生成随机字符串(字母)的一段代码被张贴here。创建文件的代码(也使用随机文件名)可用here

1

发现这在谷歌你(source here):

/// <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(); 
} 

之后,使用文件流来创建并写入文件。

3

Path.GetTempFileName()或Path.GetRandomFileName()方法呢?还要考虑到文件系统不是事务性的,两个并行进程可以创建相同的文件名。 TempFileName()应该返回唯一的名称(按规范),所以'可能'你不需要关心,如果临时目录可以适用于你的解决方案。

2

或者你可以使用一个GUID生成一个唯一的文件名:

百科:虽然每个生成的GUID

不 保证唯一性,总 一些独特的键(2^128或 3.4×10^38)是如此之大,以致相同数字 产生两次的概率无限小。

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(); 
} 
+1

我已经多次使用这种方法。这显然不是所要求的'5字母字符串',但在Windows环境中,似乎没有必要将自己限制为5个字母。这里的好处是,它是'保证'是独一无二的(即使维基百科不同意)。 BTW检查(File.Exists(文件名))是多余的,因为文件名不存在。 – 2009-08-13 08:17:21

+2

那么,你永远不知道 - 如果处理这些文件的另一个工具要求文件名不超过5个字母,那么可能需要这些5个字母的文件名。这将是另一个工具开发者方面的WTF,但是这个要求仍然存在,所以我认为“你可以使用GUID--它们不是5个字符的长度,但仍然”就像在说“或者你可能会以及根本不创建任何文件“ - 都不能解决他的问题:-D – 2009-08-13 09:36:11