2009-08-13 114 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