Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:29.9.2012 9:24

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
David Jančík [sczdavos]
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Jančík [sczdavos]:29.9.2012 10:08

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:29.9.2012 10:21

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:29.9.2012 10:27

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:29.9.2012 10:35

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:29.9.2012 11:00

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:29.9.2012 12:41

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:29.9.2012 12:57

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:29.9.2012 13:05

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:29.9.2012 13:10

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:29.9.2012 13:11

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:29.9.2012 13:14

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:29.9.2012 13:14

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:29.9.2012 13:14

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:29.9.2012 13:16

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:29.9.2012 13:21

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:29.9.2012 13:23

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:29.9.2012 13:34

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:29.9.2012 13:35

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:29.9.2012 13:36

Č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:29.9.2012 13:37

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:29.9.2012 13:44

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:29.9.2012 13:45

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:29.9.2012 13:47
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:29.9.2012 13:48

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:29.9.2012 13:48

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:29.9.2012 13:48

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:29.9.2012 13:50

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:29.9.2012 13:51

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:29.9.2012 13:58

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:29.9.2012 14:05

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:29.9.2012 16:14

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:29.9.2012 16:23

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:29.9.2012 16:37

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:29.9.2012 16:45

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:29.9.2012 16:52

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.