Python týden Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Diskuze: Přepisování textového souboru

Aktivity (4)
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:16.12.2018 10:34

Zdravím mám dotaz. Vytvářím si soubor s logováním. A chtěl bych aby se soubor sám přepisoval tzn. pokud je dosáhnuto nějaké velikosti, tak aby se začátek umazal a připsalo se na konec. Třeba přidám text kde je 5 řádek, tak uberu text kde je 5 řádek

Zkusil jsem: Zkoušel jsem googlit, ale nic moc jsem nenašel možná k tomu přistupuji blbě....

Chci docílit: dobré funkčnosti

 
Odpovědět 16.12.2018 10:34
Avatar
HONZ4
Člen
Avatar
Odpovídá na Petr Kasnal
HONZ4:16.12.2018 18:24

Buďto připisuj data na konec a jednou za čas ten soubor o něco zkrať (tzn. překopíruj část do nového souboru a starý zahoď (můžeš uživateli oznámit, že pokud chce může spustit zkrácení nebo smazání).

A nebo zvol jiný způsob ukládání záznamů (například speciální soubor, ve kterém budou data rotovat - soubor bude obsahovat informaci kde záznamy začínají - šlo by o systém s pevnou délkou záznamů), nebo nějakou databázi. Ale to budeš muset udělat i aplikaci pro zobrazení záznamů.

A nebo ty záznamy ukládej do více souborů 1.txt , 2.txt , 3.txt pokud dosáhneš max velikosti tak jen přepneš na další číslo souboru (když budeš u 3.txt přepneš na 1.txt).

 
Nahoru Odpovědět 16.12.2018 18:24
Avatar
don.jarducius:17.12.2018 7:50

Ahoj,
logování do souboru se provádí většinou tak, že se soubory "číslují" datumem, např. log_2018-12-17.txt. Případně datem a časem kdy vznikly.
Pokud chceš použít "rotaci" dat v souboru, a pracovat s ním na úrovni řádek, můžeš použít:

var Soubor = "log.txt";
var noveLogy = new string[] { "nové řádky logu", "kolik budeš chtít" };
System.IO.File.WriteAllLines(Soubor, System.IO.File.ReadAllLines(Soubor).Skip(noveLogy.Length).Union(noveLogy).ToArray());
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 17.12.2018 7:50
Avatar
Odpovídá na don.jarducius
don.jarducius:17.12.2018 7:53

Resp.

var Soubor = "log.txt";
var maxDelka = 50;
var noveLogy = new string[] { "nové řádky logu", "kolik budeš chtít" };
var logs = System.IO.File.ReadAllLines(Soubor);
if (logs.Length + noveLogy.Length > maxDelka)
    logs = logs.Skip(logs.Length + noveLogy.Length - maxDelka).ToArray();
logs = logs.Union(noveLogy).ToArray();
System.IO.File.WriteAllLines(Soubor, logs);
 
Nahoru Odpovědět 17.12.2018 7:53
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:17.12.2018 16:32

Ahoj, pokud tvá aplikace používá více vláken, tak bych celé logování asi dal i do

lock(syncObj)
{
//TODO: zápis do logu
}

 
Nahoru Odpovědět 17.12.2018 16:32
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na SebelaMichal
Petr Kasnal:18.12.2018 8:03

Ahoj děkuju za odpověď. don.jarducius děkuju nejspíše todle jsem potřeboval.Zkusím a dám vědět. děkuji
a ano používá to celá aplikace, ještě se zeptám pro zapsání do souboru používám tento zápis:

using (var mutex = new Mutex(false, "Log"))
           {
               mutex.WaitOne();
               File.AppendAllText(_file.FullName, base.Format(name, description, type) + Environment.NewLine);
               mutex.ReleaseMutex();
           }

Je to takhle v pohodě??? Nebo mám také použít to lock?

Editováno 18.12.2018 8:03
 
Nahoru Odpovědět 18.12.2018 8:03
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:23.12.2018 11:36

Lock už asi není potřeba:

https://stackoverflow.com/…ck-and-mutex

 
Nahoru Odpovědět 23.12.2018 11:36
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:25.12.2018 2:38

Super díky moc. :)

 
Nahoru Odpovědět 25.12.2018 2:38
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 8 zpráv z 8.