Avatar billede halden Nybegynder
01. januar 2004 - 22:10 Der er 24 kommentarer og
1 løsning

Skrivning til fil

Jeg har lavet en simpel tæller der bare læser og skriver til en .txt fil. Men når jeg skal skrive det nye tal i filen skal det gamle jo slettes eller overskrives.

FileStream file2 = new FileStream(Server.MapPath("./data/tæller.txt"), FileMode.Append, FileAccess.Write);
    StreamWriter sr2 = new StreamWriter(file2);
    sr2.WriteLine(tæller);

Hvordan gør jeg det???
Avatar billede milandt Nybegynder
01. januar 2004 - 22:12 #1
"Append" betyder at fylde på, altså bare at skrive videre fra slutningen af filen i stedet for at overskrive den. Kan ikke lige huske hvad du så skal gøre, men det er i al fald derfor du ikke overskriver den, men bare skriver videre..
Avatar billede arne_v Ekspert
01. januar 2004 - 22:14 #2
FileMode.Create
Avatar billede milandt Nybegynder
01. januar 2004 - 22:15 #3
go go :)
Avatar billede halden Nybegynder
01. januar 2004 - 22:15 #4
jamen hvordan overskriver jeg den så???
Avatar billede halden Nybegynder
01. januar 2004 - 22:17 #5
Her er koden:
FileStream file = new FileStream(Server.MapPath("./data/tæller.txt"), FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(file);
    int tæller = Int32.Parse(sr.ReadLine());
    if (Session.IsNewSession == true) {
      tæller++;
    }
    sr.Close();
    file.Close();
    FileStream file2 = new FileStream(Server.MapPath("./data/tæller.txt"), FileMode.Create, FileAccess.Write);
    StreamWriter sr2 = new StreamWriter(file2);
    sr2.WriteLine(tæller);
    sr2.Close();
    file2.Close();

Med dette tæller den op hver gang jeg opdatere - hvad er der galt???
Avatar billede halden Nybegynder
01. januar 2004 - 22:18 #6
den skal jo kun tælle op hvis sessionen er ny...
Avatar billede arne_v Ekspert
01. januar 2004 - 22:27 #7
Det er vist ikke et fil problem.

Det må skylde noget i session håndteringen.
Avatar billede nielsbrinch Nybegynder
01. januar 2004 - 22:27 #8
En måde at overskrive en fil på, er ved at Delete den og derefter Create den.
Avatar billede arne_v Ekspert
01. januar 2004 - 22:29 #9
Ikke nødvendigt:

Create
Supported by the .NET Compact Framework.
Specifies that the operating system should create a new file. If the file already exists, it will be overwritten.
Avatar billede arne_v Ekspert
01. januar 2004 - 22:30 #10
Iøvrigt ville jeg ændre logikken så skrivningen af den ny værdi
kom inden i if sætningen - ingen grund til at genskrive den samme værdi igen.
Avatar billede arne_v Ekspert
01. januar 2004 - 22:30 #11
Og så er jeg dybt bekymret over threadsafety i den her kode !
Avatar billede halden Nybegynder
01. januar 2004 - 22:41 #12
enig i logik - er ændret. Når du siger threadsafety hvad mener du så helt præsis???
Avatar billede arne_v Ekspert
01. januar 2004 - 22:43 #13
Jeg formoder at det her er noget ASP.NET kode !?

Og jeg er bekymret over hvad der sker hvis det her kode udføres
samtidigt af 2 tråde (brugere).
Avatar billede halden Nybegynder
01. januar 2004 - 22:54 #14
enig - det skal være threadsafe. Det går jo ikke at en bruger læser et nummer og derefter får en anden proces tid og når helt ned og ændre nummeret og derefter ser den første jo et forkert antal.
Er newbie til asp.net - skal nok få styr på det. Hvor kan jeg lære noget om threadsafe kode??? samt session management???
Avatar billede arne_v Ekspert
01. januar 2004 - 22:58 #15
Et par oplagte muligheder var:

* erstat den flade fil med en database tabel og lad databasen klare
  problemerne med et passend etransaction isolation level

* brug C# lock keyword til at synkronisere adgangen til de flade filer

* brug C# lock keyword til at synkronisere adgangen til en static variabel
Avatar billede arne_v Ekspert
01. januar 2004 - 23:02 #16
Noget at læse ?

threadsafe kode bør stå ennhver god C# bog (principielt kan du
også læse i en Java eller C++ bog - problemstillingerne er ret universelle).

session management må være i en ASP.NET bog.
Avatar billede halden Nybegynder
01. januar 2004 - 23:05 #17
kan du give et eksempel på lock???
Avatar billede halden Nybegynder
01. januar 2004 - 23:09 #18
hvad med det her:

lock (this) {
FileStream file = new FileStream(Server.MapPath("./data/tæller.txt"), FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(file);
    int tæller = Int32.Parse(sr.ReadLine());
    if (Session.IsNewSession == true) {
      tæller++;
    }
    sr.Close();
    file.Close();
    FileStream file2 = new FileStream(Server.MapPath("./data/tæller.txt"), FileMode.Create, FileAccess.Write);
    StreamWriter sr2 = new StreamWriter(file2);
    sr2.WriteLine(tæller);
    sr2.Close();
    file2.Close();
}
Avatar billede arne_v Ekspert
01. januar 2004 - 23:10 #19
Hvis ASP.NET kun laver et objekt og lader flere tråde bruge det, så
er det en perfekt løsning.

Hvis ASP.NET laver et objekt per tråd, så duer det ikke.

Jeg kender ikke ASP.NET !
Avatar billede arne_v Ekspert
01. januar 2004 - 23:11 #20
Hvis der kan være flere objekter, så laver du bare en static variabel
og laver lock på (den er jo delt mellem alle instanser).
Avatar billede halden Nybegynder
02. januar 2004 - 00:38 #21
nå, men jeg har stadig ikke fået løst mit problem for den tæller op hver gang jeg opdatere siden. Hvorfor gør den det og hvordan løser jeg det???
Avatar billede nielsbrinch Nybegynder
02. januar 2004 - 03:43 #22
Prøv at lægge koden i din Session_Start i global.asax - så skulle den kun gøre det én gang pr. session (hvis det er det du forsøger at gøre, er ikke helt sikker)
Avatar billede halden Nybegynder
02. januar 2004 - 10:52 #23
jeg har ingen Session_Start. Det eneste jeg skal bruge session til er at registrere når der sker et nyt request så tælleren skal tælles 1 op. Hvordan gør jeg det???
Avatar billede halden Nybegynder
02. januar 2004 - 12:00 #24
tror jeg opretter en tråd i asp.net kategorien istedet...
Avatar billede halden Nybegynder
02. januar 2004 - 12:00 #25
tak for de mange rigtigt gode kommentarer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB