2009-05-01 90 views
4

我想在我的網站上創建隨機文件夾名稱來存儲圖像及其縮略圖,但不是使用完整版本的生成的GUID,而是考慮使用只是其中的一部分,也許只是前8個字符,可能還有base64編碼。儘管我擔心可能發生碰撞。如何在.NET中創建12個字符的隨機文件夾名稱

有人能指出我的方向是否正確嗎?有沒有其他的解決方案,可以使用,如果我想保持一定數量的字符下的名稱?

更新:我想從path.GetRandomFileName望而卻步,因爲它使用的原始GUID,它不是12個字符長...

回答

13

爲什麼不只是使用這樣的東西,並循環,直到你可以創建沒有衝突的文件?

const string ValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

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種可能的組合)。

3

您可以使用Path類System.IO來,除其他外,生成隨機文件和文件夾名稱。

9

System.IO.Path.GetRandomFileName()

+0

函數使用guid創建文件夾名稱,這正是我想要避免的。我怎樣才能得到一個名稱爲「dGhlIG1pbmQs」的文件夾? – ak3nat0n 2009-05-01 17:28:03

+0

不,它返回一個8.3名稱。 8個字符,句點,3個字符,全部是字母數字。 – bsneeze 2009-05-01 21:47:36

1

如果您使用的是數據庫爲您的網站,那麼你可以使用自動遞增的數字或序列來生成圖像唯一的文件名。

使用Oracle會創建一個序列如下;

CREATE SEQUENCE SEQUENCE_NAME MINVALUE值 MAXVALUE值 WITH值 INCREMENT BY值 CACHE START值;

要獲得序列中的下一個值,請使用序列的nextval。例如

CREATE SEQUENCE seq_user_id;

SELECT seq_user_id.NEXTVAL FROM dual;

INSERT INTO test_bed(user_id,class_type,room_location) VALUES(seq_user_id.NEXTVAL,'Underwater Basketweaving','RM1205');

+0

你將如何生成該序列? – ak3nat0n 2009-05-01 17:36:20

相關問題