Diskuze: Nepoužité jméno

C# .NET .NET (C# a Visual Basic) Nepoužité jméno American English version English version

Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
jako vstup může být jak složka, tak i soubor. Potřebuji zajistit aby daný soubor ještě neexistoval:

private string NoExistName(string file, bool rtf = false)
{
    int number = 2;
    string soubor = "";

    var list = new List<string>(Directory.GetDirectories(Directory.GetParent(file).FullName));
    list.AddRange(new List<string>(Directory.GetFiles(Directory.GetParent(file).FullName)));

    if (!list.Contains(file))
        return file;

    for (soubor = file + number + (rtf ? ".rtf" : ""); list.Contains(soubor); number++);
        return soubor;
}

Řekl bych, že jsem to měl lepší - ale ze zoufaství zkouším úplně všechno. Problém - který nezmizel ani po úplném přepsání kódu:

První 2 složky se vytvoří bez problému, pak buď již vzniká jen složka X2, nebo se neuzavře cyklus... Děkuji za případnou pomoc.

 
Odpovědět 23.9.2012 7:24
Avatar
matesax
Redaktor
Avatar
Odpovídá na matesax
matesax:

Tak již jsem si uvědomil o co go... :)

private string NoExistName(string parent, string fileName, bool rtf = false)
{
    int number = 2;
    string soubor = "";

    var list = new List<string>(Directory.GetDirectories(parent));
    list.AddRange(new List<string>(Directory.GetFiles(parent)));

    if (!list.Contains(fileName))
        return fileName;

    while (list.Contains(soubor))
    {
        soubor = fileName + number + (rtf ? ".rtf" : "");
        number++;
    }

    return soubor;
}
Editováno 23.9.2012 8:31
 
Nahoru Odpovědět 23.9.2012 8:28
Avatar
matesax
Redaktor
Avatar
Odpovídá na matesax
matesax:
private string NoExistName(string file, bool rtf = false)
{
    int number = 2;
    string soubor = "";

    var list = new List<string>(Directory.GetDirectories(Directory.GetParent(file).FullName));
    list.AddRange(new List<string>(Directory.GetFiles(Directory.GetParent(file).FullName)));

    if (!list.Contains(file))
        return file;

    while (list.Contains(soubor = file + number + (rtf ? ".rtf" : "")))
        number++;

    return soubor;
}

Pardon...

 
Nahoru Odpovědět 23.9.2012 8:36
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Není jednodušší požádat systém o vytvoření a otevření souboru s unikátním jménem?

Nahoru Odpovědět 23.9.2012 8:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Toš - kdybych věděl, že to jde - a jak... :)

Ale já bych chtěl své jméno - jen porovnat existenci - a nechci jej otevírat...

Editováno 23.9.2012 8:50
 
Nahoru Odpovědět 23.9.2012 8:47
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Dělám to příkazem mktemp, kterému zadám své jméno a několik "X", které nahradí náhodným stringem, ale v C# to asi bude jinak. I když se přiznám, že pracovní soubor jsem už hooodně dlouho nepotřeboval.

Pokud ten soubor nechceš otevírat, tak tvé počínání moc nechápu. Pokud ten soubor chceš vytvořit, ale nechceš přepsat stávající, tak ho vytvoř s atributem "nepřepisovat existující" a ošetři výjimku.

Nahoru Odpovědět 23.9.2012 9:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

To je přece nesmysl - takto mám 100% jistotu, že nebude schoda. Náhodný string není problém, ale to mi tedy přijde lepší můj postup...

 
Nahoru Odpovědět 23.9.2012 9:03
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Systém mi nikdy nepřidělí existující název. To je tou funkcí garantováno. Ten tvůj postup nevyloučí souběh, můj ano. Kritická sekce musí být co nejmenší, nejlépe přímo v systémové funkci.

BTW: Nenechávej chodit shodu po schodech.

Nahoru Odpovědět 23.9.2012 9:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Pokud chceš jen předejít přepsání souboru, změň vlastnost FileMode.OpenOr­Create.

Nahoru Odpovědět 23.9.2012 9:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kit
Kit:

... na FileMode.CreateNew

Nahoru Odpovědět 23.9.2012 9:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Ale já nevytvářím jen soubory - píši to nahoře...

 
Nahoru Odpovědět 23.9.2012 9:41
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Netuším, co vlastně potřebuješ, ale možná se ti bude hodit tento link:

http://msdn.microsoft.com/…s2f1fez.aspx

Nahoru Odpovědět 23.9.2012 9:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Potřebuji vytvořit složku, či rtf soubor - se specifickými jmény. Uživatel si zadá jejich jména - bez přípony (jedná-li se zrovna o rtf) - a je třeba otestovat - zda není vstup nulový/prázdný string a zda neexistuje dané jméno. Tímto to sfouknu obojí najednou... Tedy ternárně doplním cestu a pak ji jen zde doplním o ID - je-li v kolizi...

 
Nahoru Odpovědět 23.9.2012 9:58
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

http://ulozto.cz/…gascripe-exe

N - nový
F2 - edit
Delete - delete

+

ContextMenuStrip...

Editováno 23.9.2012 10:08
 
Nahoru Odpovědět 23.9.2012 10:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.