Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 3. diel - Práca s textovými súbormi v C# .NET

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
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

Avatar
Odpovedá 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.

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

Avatar
Odpovedá 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).

Editované
Avatar
Odpovedá 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í.

Avatar
Odpovedá 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íš.

Avatar
Odpovedá 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?

Avatar
Odpovedá 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?

Avatar
Odpovedá 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.

Avatar
Odpovedá 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í.

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 64.