[C#] Kontrola velkosti suboru pocas zapisu

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod sejnt 15. 12. 2012 22:10

Zdravim mam tento kod

Kód: Vybrat vše
FileInfo fi = new FileInfo(@"D:\" + textBox1.Text + ".arff");
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\" + textBox1.Text + ".arff", true))
{
        while (fi.Lenght < 10000000)
        {
                 file.WriteLine(" blabla ");           
       }
}


bohuzial fi.Lenght sa mi aktualizuje iba pri prvej iteracii, potom ostava rovnaka. Skusil som aj file.BaseStream.Length ale efekt ostal rovnkay. Vopred dakujem.
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Odeslat příspěvekod Wikan 15. 12. 2012 23:28

Zkus fi.Refresh()
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod sejnt 15. 12. 2012 23:44

Dal som to do toho cyklu, vysledok je stale rovnaky.
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Odeslat příspěvekod nutter 16. 12. 2012 00:11

Problem bude pravdepodobne v tom, ze disk nepovazuje za nutny na kazdej tvuj dotaz zajet hlavou na konkretni misto a tam zjistit realnou velikost souboru. File manager te dava zastaraly informace z nejake "shadow" kopie, ktera se aktualizuje az po nejake rozumne dlouhe dobe, nebo po nejake rozumne udalosti. Treba kdyz se ten soubor uzavre.

http://blogs.msdn.com/b/oldnewthing/arc ... 51026.aspx
nutter
Junior

Odeslat příspěvekod Nargon 16. 12. 2012 09:02

Problém je že mezitím nezapisuješ data na disk a neobnovuješ FileInfo z disku.
Můžeš vyzkoušet toto:
Kód: Vybrat vše
file.WriteLine(" blabla ");   
file.Flush(); //skutecne zapise data na disk
fi.Refresh(); //nacte znova velikost souboru z disku
Ale tohle je fakt celkem neefektivní způsob, který dost zatěžuje disk. Pokusil bych se tomu vyhnout.


Jestli to půjde vyzkoušej tohle:
Kód: Vybrat vše
while (file.BaseStream.Lenght < 10000000)

Je to mnohem lepší a pracuje to spíš v paměti než přes ten disk.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod sejnt 16. 12. 2012 13:26

tak ta prva moznost s

Kód: Vybrat vše
fi.Refresh()


vobec neprichadza do uvahy cas je takmer 10 naosbne vacsi a hodnota length sa aj tak nemeni. Ale pri pouziti

Kód: Vybrat vše
file.Flush()


je cas len stvornasobne vacsi a velkost lenght sa uz meni.
Budem musiet najst iny sposob ako to kontrolovat, pretoze potrebujem vygenerovat subor vo velkosti niekolkych GB.Alebo je nejaky iny sposob efektivnejsieho zapisu do textoveho suboru??
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Odeslat příspěvekod Wikan 16. 12. 2012 14:09

Tak snad víš jak velké řetězce tam zapisuješ, takže bys to měl umět zjistit z toho.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod PiranhaGreg 17. 12. 2012 09:05

Zjisti si kolik bitů ti zabírá jeden znak u kódování které používáš (u UTF-16 to bude trochu horší) a spočítej si tak, kolik tam toho budeš muset zapsat aby to mělo danou velikost ;-) .
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod Nargon 17. 12. 2012 10:51

a co tohle:
Kód: Vybrat vše
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\" + textBox1.Text + ".arff", true))
            {
                while (file.BaseStream.Length < 10000000)
                {
                    file.WriteLine(" blabla ");
                    file.Flush();
                }
            }


Samozřejmě aby to běhalo alespoň trochu normálně, tak před voláním Flush by to chtělo do souboru zapsat blok cca 64KB a nedělat to tak jak to je teď napsané, protože to zapisuje do souboru po bloku 10B.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod sejnt 18. 12. 2012 01:29

Ako myslis to zapisat, nestaci nastavit to takto

Kód: Vybrat vše
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\test05" + i  +".arff", true, coding ,65536))
??
dat tam len hodnotu bufferu??
Ked som to robil takto tak som tam mal pri vytvarani 1GB suboru tak 10 sekundove rozdiely. najlepsie dopadla velkost 16KB za 9min 52sek.
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků