Diskuze: Zapisování do vytvořeného souboru
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 36 zpráv z 36.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Uzavíráš I/O stream? stream.Close()
nebo použij
using
Viz.: http://www.itnetwork.cz/…-soubory-txt
Nezdá. Zapisování INI souborů do adresáře s aplikací je známý nešvar.
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.
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
using...
using (StreamWriter sr = new StreamWriter(new FileStream(cesta, FileMode.OpenOrCreate)))
sr.WriteLine(blabla);
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.
právě streamu jsem se chtěl vyvarovat, já potřebuji aby to obsah souboru přepsalo, ne přidávalo text
ini soubory mi přijdou vhodný na nastavení, je to elegantnější než zapisovat nastavení do TXT
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...
Pokud pracuješ pod .NETem, tak cti přístup, jaký se tam používá, tedy XML, ostatně jako ve většině jazyků.
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.
Chce to jen na konfigurák. V příslušné sekci tutoriálů je vše popsané.
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.
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á.
Ale v podstatě se nejedná o typ souboru, ani jak do něj zapisovat, ten soubor je po vytvoření nepřístupný
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á.
Č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.
Ve Windows naštěstí jinam psát nejde, čili toho bych se nebál.
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
}
}
Co je v GetAppDir?
Již jsem ti psal, abys INI nepoužíval, nedělá se to.
GetAppDir
{
FileInfo fi = new FileInfo(Application.ExecutablePath);
return fi.DirectoryName;
}
taky jsem zkoušel soubory mppl, sett, txt, ale ten samý problém
Proč? Proč mě neposlechneš?
using (StreamWriter sr = new StreamWriter(new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\jméno souboru", FileMode.Create)))
sr.WriteLine(blabla);
Evidentně jsi nečetl vůbec nic.
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
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...
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.
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.
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.
A zapisuješ již do složky v AppData, jak je tu ukázáno?
No protože je jen ke čtení! To jsis udělal sám... Smaž jej - a nech vytvořit StreamReaderem/StreamWriterem - s tím pak půjde pracovat...
Právě to zkoušim pokáždé, smažu, vytvoří to ale nezapíše
Zobrazeno 36 zpráv z 36.