Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:23.9.2012 7:24

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
Tvůrce
Avatar
Odpovídá na matesax
matesax:23.9.2012 8:28

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
Tvůrce
Avatar
Odpovídá na matesax
matesax:23.9.2012 8:36
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
Tvůrce
Avatar
Odpovídá na matesax
Kit:23.9.2012 8:41

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:23.9.2012 8:47

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:23.9.2012 9:00

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:23.9.2012 9:03

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:23.9.2012 9:12

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:23.9.2012 9:33

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
Tvůrce
Avatar
Odpovídá na Kit
Kit:23.9.2012 9:39

... 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
Tvůrce
Avatar
Odpovídá na Kit
matesax:23.9.2012 9:41

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

 
Nahoru Odpovědět
23.9.2012 9:41
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:23.9.2012 9:50

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:23.9.2012 9:58

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:23.9.2012 10:06

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.