Diskuze: Zapisování do vytvořeného souboru

C# .NET .NET (C# a Visual Basic) Zapisování do vytvořeného souboru American English version English version

Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:

Potřeboval bych poradit se zapisováním, normální zápis do souboru nedělá problém

File.WriteAllLines(Extensions.GetAppDir + "\\Settings.ini", default_settings);

ale má to podmínku, pokud ten soubor na začátku spuštění souboru teprve vytvořím až do ukončení do něj nelze zapisovat, zapisovat do něj mohu až při příštím spuštění programu, pokud někdo víte v čem je háček, byl bych vděčný za případnou odpověď

Odpovědět 29.9.2012 9:24
Přecházím na "Cross-Platform Development"
Avatar
Odpovídá na Theodor Johnson
David Jančík [sczdavos]:

Uzavíráš I/O stream? stream.Close() nebo použij using
Viz.: http://www.itnetwork.cz/…-soubory-txt

Nahoru Odpovědět 29.9.2012 10:08
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

Zdá se mi to, nebo je to další INI? :)

 
Nahoru Odpovědět 29.9.2012 10:21
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Nezdá. Zapisování INI souborů do adresáře s aplikací je známý nešvar.

Nahoru Odpovědět 29.9.2012 10:27
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 proč? Nevidím důvod proč nepoužívat databázi...

 
Nahoru Odpovědět 29.9.2012 10:35
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Adresář s aplikací by měl být systémem chráněn proti zápisu, aby do něj nemohly viry. Proto by takový zápis ani neměl být možný. Data mají být v uživatelském adresáři, nejlépe v databázi. Nebo také v databázi mimo uživatelský adresář a mimo adresář s aplikací.

Tvá otázka mi nedává logiku. Jsem pro používání databází a jsem proti zápisu do adresáře, ve kterém je aplikace.

Nahoru Odpovědět 29.9.2012 11:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:

Netýká se to jen tohoto ini souboru, v podstatě je jedno jakou má příponu, u jakéhokoliv souboru mi to nejde do ukončení programu zapisovat

Nahoru Odpovědět 29.9.2012 12:41
Přecházím na "Cross-Platform Development"
Avatar
matesax
Redaktor
Avatar
Odpovídá na Theodor Johnson
matesax:

using...

using (StreamWriter sr = new StreamWriter(new FileStream(cesta, FileMode.OpenOrCreate)))
    sr.WriteLine(blabla);
Editováno 29.9.2012 12:58
 
Nahoru Odpovědět 29.9.2012 12:57
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Co máte s těmi INI? To máte z GameMakeru, ne? Podívej se do sekce práce se soubory v C#, vše se tam řeší. Na konfiguráky se používá XML.

Nahoru Odpovědět 29.9.2012 13:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na matesax
Theodor Johnson:

právě streamu jsem se chtěl vyvarovat, já potřebuji aby to obsah souboru přepsalo, ne přidávalo text

Editováno 29.9.2012 13:11
Nahoru Odpovědět 29.9.2012 13:10
Přecházím na "Cross-Platform Development"
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:

ini soubory mi přijdou vhodný na nastavení, je to elegantnější než zapisovat nastavení do TXT

Nahoru Odpovědět 29.9.2012 13:11
Přecházím na "Cross-Platform Development"
Avatar
matesax
Redaktor
Avatar
Odpovídá na Theodor Johnson
matesax:

Jekn kvůli tomu se mu vyhýbáš? :)

using (StreamWriter sr = new StreamWriter(new FileStream(cesta, FileMode.Create)))
    sr.WriteLine(blabla);

Jak těžké...

Mnohem lepší bude databáze...

Editováno 29.9.2012 13:15
 
Nahoru Odpovědět 29.9.2012 13:14
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Pokud pracuješ pod .NETem, tak cti přístup, jaký se tam používá, tedy XML, ostatně jako ve většině jazyků.

Nahoru Odpovědět 29.9.2012 13:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Pokud potřebuješ data v aplikaci i zapisovat, tak se nehodí ani INI ani XML, protože musíš ručně ošetřovat ACID. Na to jsou databáze.

Nahoru Odpovědět 29.9.2012 13:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Chce to jen na konfigurák. V příslušné sekci tutoriálů je vše popsané.

Nahoru Odpovědět 29.9.2012 13:16
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Jenže on do toho konfiguráku chce z té aplikace zapisovat. A to bez dalších opatření není bez rizika. Proto je lepší databáze.

Nahoru Odpovědět 29.9.2012 13:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Jak by mohlo dojít ke kolizi? Soubor bude ve složce uživatele, jedině, že by spustil program vícekrát, ale to je také jedno, prostě by tam zůstalo nastavení poslední instance. Takhle to mají přeci všechny programy. DB je pro tyto účely zbytečně složitá.

Nahoru Odpovědět 29.9.2012 13:23
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:

Ale v podstatě se nejedná o typ souboru, ani jak do něj zapisovat, ten soubor je po vytvoření nepřístupný

Nahoru Odpovědět 29.9.2012 13:34
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Mám už takovou zkušenost. Jak se nějaký program rozšíří, hned ho někdo vrzne na serverový disk. A průšvih je na světě. Pokud je ten adresář chráněn proti zápisu, přestane to fungovat.

Pokud chceš zapisovat do konfiguráku aplikace, tak ten konfigurák musí být v uživatelském prostoru, aby se do něj dalo zapsat.

INI je také DB, ale pro práci s ním se musí použít DB vrstva, která je docela tenká. Jinak se jako DB nechová.

Nahoru Odpovědět 29.9.2012 13:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Četl jsi ty tutoriály, třeba ohledně oprávnění UAC? Řešíš tu něco, co je tu vysvětleno, přečti si to.

Editováno 29.9.2012 13:37
Nahoru Odpovědět 29.9.2012 13:36
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Ve Windows naštěstí jinam psát nejde, čili toho bych se nebál.

Nahoru Odpovědět 29.9.2012 13:37
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:

Kouknul jsem na to, ale nic co by vysvětlovalo můj problém
code:

private void CheckFileExist()
{
    if (!File.Exists(Extensions.GetAppDir + "\\Settings.ini"))
        {
        File.Create(Extensions.GetAppDir + "\\Settings.ini");
        File.WriteAllLines(Extensions.GetAppDir + "\\Settings.ini", defaultSettings);
//V tom File.WriteAllLines mi to při spuštění funkce napíše že do souboru nelze zapisovat
        }
}
Nahoru Odpovědět 29.9.2012 13:44
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Co je v GetAppDir?

Již jsem ti psal, abys INI nepoužíval, nedělá se to.

Nahoru Odpovědět 29.9.2012 13:45
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:
GetAppDir
{
    FileInfo fi = new FileInfo(Application.ExecutablePath);
    return fi.DirectoryName;
}
Nahoru Odpovědět 29.9.2012 13:47
Přecházím na "Cross-Platform Development"
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:

taky jsem zkoušel soubory mppl, sett, txt, ale ten samý problém

Nahoru Odpovědět 29.9.2012 13:48
Přecházím na "Cross-Platform Development"
Avatar
matesax
Redaktor
Avatar
Odpovídá na Theodor Johnson
matesax:

Proč? Proč mě neposlechneš? :)

using (StreamWriter sr = new StreamWriter(new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\jméno souboru", FileMode.Create)))
    sr.WriteLine(blabla);
 
Nahoru Odpovědět 29.9.2012 13:48
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Evidentně jsi nečetl vůbec nic.

  1. Přečti si tutoriály.
  2. Piš do uživatelské složky.
  3. Použij XML.
Nahoru Odpovědět 29.9.2012 13:48
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na matesax
Theodor Johnson:

Protože už mám kód přes 1000 řádků a je tam hodně toho závislýho na Listu který se načte přes File.ReadAllLines

Nahoru Odpovědět 29.9.2012 13:50
Přecházím na "Cross-Platform Development"
Avatar
matesax
Redaktor
Avatar
Odpovídá na Theodor Johnson
matesax:

Tak to je špatně!... Soubor se má načíst jen jednou a uložit jen jednou - při spuštění přečíst, při ukončení uložit...

 
Nahoru Odpovědět 29.9.2012 13:51
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Ten tvůj přístup je také špatně. Data se mají na disk zapsat už v okamžiku, kdy vzniknou, aby se nemuselo řešit např. ukládání po 10 minutách. Daleko jednodušší je zapisovat průběžně. Také je to mnohem spolehlivější a je možné, aby takto komunikovalo více procesů mezi sebou.

Nahoru Odpovědět 29.9.2012 13:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Někdy stačí dát zápis jen na OK tlačítko nějakého dialogu s nastavením. Pokud je aplikace jednoduchá, tak i na to ukončení, pořád vítězí že volání uložení je jen jednou nad tím, že program může něco málo zapomenout.

Pokud je aplikace složitá a nastavení je hodně, zpravidla použijeme databinding a databázi (to jsi měl asi na mysli), ale to předimenzováváme původní dotaz v tomto vláknu.

Nahoru Odpovědět 29.9.2012 14:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:

Zkoušel jsem to přepsat na ten StreamWriter, ale soubor mi to nezpřístupnilo, ten StreamWriter nic nezapsal a při ukončování, a zápisu současného nastavení mi to hlásilo že do souboru nelze zapisovat.

Nahoru Odpovědět 29.9.2012 16:14
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

A zapisuješ již do složky v AppData, jak je tu ukázáno?

Nahoru Odpovědět 29.9.2012 16:23
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Theodor Johnson
matesax:

No protože je jen ke čtení! To jsis udělal sám... Smaž jej - a nech vytvořit StreamReaderem/Stre­amWriterem - s tím pak půjde pracovat...

 
Nahoru Odpovědět 29.9.2012 16:37
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na matesax
Theodor Johnson:

Právě to zkoušim pokáždé, smažu, vytvoří to ale nezapíše

Nahoru Odpovědět 29.9.2012 16:45
Přecházím na "Cross-Platform Development"
Avatar
matesax
Redaktor
Avatar
Odpovídá na Theodor Johnson
matesax:

Pošli mi, co tam máš... (U proměnných obsah.)

 
Nahoru Odpovědět 29.9.2012 16:52
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 36 zpráv z 36.