2009-08-13 13 views
6

Muszę zrobić pętlę, aby wygenerować 5 losowo wybranych ciąg liter, a następnie utworzyć plik tekstowy pod tą nazwą, powiedzmy w C: //, jak to zrobić? Zarówno generowanie nazwy, jak i tworzenie pliku w katalogu. Myślę, że muszę wybrać 5 liczb losowych z kodów ascii, dodać je do tablicy, a następnie przekonwertować je na odpowiedniki znaków, aby móc użyć go jako nazwy. Idk, jak przekonwertuję ich na postać i stworzę z nimi sznur, czy możesz mi pomóc?Jak wygenerować losowy nazwany plik tekstowy w języku C#?

+0

pewno tam z Orens odpowiedź ponieważ mogłeś skończyć z różnymi rodzajami nielegalnych ścieżek plików – ThePower

Odpowiedz

6

Jeśli chcesz utworzyć nazwy plików to poczuć, umieścić znaki, które chcesz użyć w ciąg znaków i wybrać z, że:

// 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

Po co przyszło? Jeśli nie wyjaśnisz, co to jest, że uważasz, że jest źle, to nie może poprawić odpowiedzi. – Guffa

35

Sprawdź metody GetTempFileName i GetRandomFileName klasy System.IO.Path.

  • GetRandomFileName tworzy „kryptograficznie silne” nazwę pliku i jest bliżej jednego do co prosiłeś.

  • GetTempFileName tworzy unikalną nazwę pliku w katalogu - a także tworzy plik zerowy o tej samej nazwie - pomagając zapewnić jej wyjątkowość. To może być bliższe temu, czego możesz potrzebować.

+0

+1 właśnie, co miałem odpowiedzieć :-) – galaktor

1

Fragment kodu, który generuje losowy ciąg znaków (liter), został opublikowany here. Kod, który tworzy pliki (również przy użyciu losowych nazw plików) jest dostępny pod numerem here.

1

znaleźć w Google to dla ciebie (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(); 
} 

potem wykorzystać strumienie plików w celu utworzenia i zapisania pliku.

3

Co z metodami Path.GetTempFileName() lub Path.GetRandomFileName()? Rozważmy również fakt, że system plików nie jest transakcyjny, a dwa równoległe procesy mogą tworzyć tę samą nazwę pliku. TempFileName() powinien zwracać unikalną nazwę (według specyfikacji), więc "być może" nie musisz się tym martwić, jeśli katalog temp może być odpowiedni dla twojego rozwiązania.

2

Albo można użyć GUID generowania unikalnego pliku:

Wikipedii:

Chociaż każda generowane GUID nie jest gwarancją wyjątkowy, całkowita liczba unikalnych kluczy (2^128 lub 3.4 × 10^38) jest tak duży, że prawdopodobieństwo wygenerowania dwukrotnie tej samej liczby jest nieskończenie małe.

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

Użyłem tej metody wiele razy. Oczywiście nie jest to ciąg "5 liter", ale w środowisku Windows nie ma potrzeby ograniczania się do 5 liter. Korzyścią jest to, że jest "gwarantowana", że jest unikalna (nawet jeśli Wikipedia się nie zgadza). Sprawdzanie BTW (File.Exists (nazwa pliku)) jest zbędne, ponieważ nazwa pliku nie istnieje. –

+2

Cóż, nigdy nie wiadomo - może istnieć potrzeba użycia tych 5-literowych nazw plików w przypadku, gdyby inne narzędzie przetwarzające te pliki wymagało, aby nazwy plików nie były dłuższe niż 5 liter. Byłby to WTF na stronie programisty innego narzędzia, ale wymaganie jest nadal aktualne, więc w mojej opinii mówię: "Możesz używać GUID-ów - nie są to 5 znaków, ale nadal" jest jak mówienie "Albo możesz a także po prostu nie twórz żadnego pliku "- oba nie rozwiązują problemu :-D –

Powiązane problemy