NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Lekce 3 - Práce s textovými soubory v C# .NET

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jakub Ondrák:18.5.2018 17:27

priority: Low :-)

WriteAllLines(po­leStringu, cestaKSouboru) nebo AppendAllLines(po­leStringu, cestaKSouboru)

nejdřív je cestaKSouboru a pak poleStringu

 
Odpovědět
18.5.2018 17:27
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:2.5.2019 21:51

vypustueni z pameti... nema presne tohle delat GC, nebo na co tam je? Nebo to je tak, jak rikal kolega ve druhem dilu, ze by "using" vubec nemusel existovat, kdyby se na ty objekty pouzival destruktor a k vypusteni z pameti by tedy doslo automaticky.

 
Odpovědět
2.5.2019 21:51
Avatar
Patrik Pastor:2.5.2019 22:31

Chtel jsem se zeptat, sice to "pro jednoduchost" autor neuvadi, ale chtel jsem si zapis do souboru vyzkouset ve vytvorenem souboru ve druhe dile (kde je rec o pravech a kod s try, catch podminkama), ale soubor se mi nevypsal, takze by bylo dobre pro tu "jednoduchost" udelat i priklad. Udelal jsem toto:

if (File.Exists(Pat­h.Combine(ces­ta, "databaze.dat")))
{
try
{
// Zde umístěte kód pro načtení vašeho nastavení ze souboru
....
}
catch
{
...
}
else
{
try
{
// Zde umístěte kód pro vytvoření vašeho nastavení
using (StreamWriter sw = new StreamWriter(@"C:\U­sers\ppast\Ap­pData\Roaming\A­plikace"))
// cesta k prvnimu vytvorenemu souboru se vsemi podminkami a pravy
{
sw.WriteLine("První řádek");
sw.WriteLine("Tento text je na druhém řádku");
sw.WriteLine("A do třetice.");
sw.Flush();
}
}

Ale nevypsalo se mi nic (reps. nevytvoril se ani soubor), takze prosim o radu, nebo autora aby si dal praci a pro tu "jednoduchost" udelal priklad se souborem i se pravy a podminkami, diky

 
Odpovědět
2.5.2019 22:31
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3.5.2019 0:09

Jedná se o to že při I/O operacích se volají funkce operačního systému a po dokončení práce se opět musí volat funkce operačního systému na uzavření souboru. Toto ale GC nedělá, potože to ani není jeho práce. GC čistí paměť, neprovádí volání operačního systému.

Volání Close, respktive Dispose naopak ten objekt neodstraní z paměti, ale pouze provede to volání operačního systému, které v operačním systému uzavře přístup k souboru. O odstranění objektu (např. StreamWriter) z paměti se potom řádně postará GC.

Pokud Close nezavoláš, tak GC ten objekt odstraní z paměti (ale nezavolá funkci zavření v operačním systému). Paměťově je to v tvé aplikaci OK, ale v operačním sytému stále visí ten otevřený soubor se kterým jednak nejde pracovat (ani tvoje aplikace, která už nemá třídu, která se souborem uměla pracovat, ani jiné aplikace, protože soubor je blokován tvou aplikací) a jednak operační systém musí kvůli toho udržovat nějaké interní informace, které zabírají paměť (a toto teprve dělá ten memory leak).

Editováno 3.5.2019 0:10
 
Odpovědět
3.5.2019 0:09
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3.5.2019 0:12

Destruktory se v .NET moc nepoužívají, protože to zpomaluje čištění paměti a přidává overhead každému objektu. Místo toho se používá using blok a rozhraní IDisposable, které ten overhead přidává jen třídám, které to opravdu potřebují.

 
Odpovědět
3.5.2019 0:12
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3.5.2019 0:14

takt o spadlo na nějakou vyjímku. Zakomentuj si blok try/catch nebo si dej do catch breakpoint nebo něco a uvidíš.

 
Odpovědět
3.5.2019 0:14
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:3.5.2019 8:19

Takze kod je ok? Muzu pouzivat using v tom kontextu?(tedy v podmince else, kdyz jeste neexistuje soubor, a je using pouzit v try bloku). Cili kod je ok, ale mam hledat exception, kterou to vyhodi?

 
Odpovědět
3.5.2019 8:19
Avatar
Odpovídá na Michal Žůrek - misaz
Patrik Pastor:3.5.2019 8:22

pokud by ale byly destruktory zde, tak by prece zrusili referencen jak v aplikaci, tak v operacni pameti (timpadem by nedochazovalo k memoryleak) a GC by byl zbytecny, proc se tedy nepouzivaji?

 
Odpovědět
3.5.2019 8:22
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3.5.2019 13:19

using můžeš (a měl bys) používat všude, kde pracuješ v souboru. Je jendo jestli je to v else, try nebo někde jinde.

 
Odpovědět
3.5.2019 13:19
Avatar
Odpovídá na Patrik Pastor
Michal Žůrek - misaz:3.5.2019 13:20

viz. můj 2 komentář z 3.5.2019 0:12

Destruktory se v .NET moc nepoužívají, protože to zpomaluje čištění paměti a přidává overhead každému objektu. Místo toho se používá using blok a rozhraní IDisposable, které ten overhead přidává jen třídám, které to opravdu potřebují.

 
Odpovědět
3.5.2019 13:20
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 10 zpráv z 64.