Stránka 1 z 1

[C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 15. 12. 2012 22:10
od sejnt
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.

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 15. 12. 2012 23:28
od Wikan
Zkus fi.Refresh()

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 15. 12. 2012 23:44
od sejnt
Dal som to do toho cyklu, vysledok je stale rovnaky.

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 16. 12. 2012 00:11
od nutter
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

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 16. 12. 2012 09:02
od Nargon
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.

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 16. 12. 2012 13:26
od sejnt
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??

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 16. 12. 2012 14:09
od Wikan
Tak snad víš jak velké řetězce tam zapisuješ, takže bys to měl umět zjistit z toho.

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 17. 12. 2012 09:05
od PiranhaGreg
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 ;-) .

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 17. 12. 2012 10:51
od Nargon
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.

Re: [C#] Kontrola velkosti suboru pocas zapisu

Odeslat příspěvekNapsal: 18. 12. 2012 01:29
od sejnt
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.