c # - Lås en fil, mens du beholder evnen til at læse/tilføje/skrive/afkorte i samme tråd?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en fil, der stort set indeholder ansøgningens tilstand.


Jeg vil gennemføre følgende adfærd:



  • Når applikationen er startet, skal du låse filen, så ingen andre applikationer (eller brugeren selv) kan ændre den;

  • Læs den tidligere ansøgningstilstand fra filen;

  • ... gør arbejde ...

  • Opdater filen med en ny stat (som i betragtning af formatet af filen indebærer omskrivning af hele filen; filens længde kan falde efter operationen);

  • ... gør arbejde ...

  • Opdater filen igen

  • ... gør arbejde ...

  • Hvis arbejdet mislykkedes (programnedbrud), låses låsningen, og indholdet af filen efterlades som det var efter den foregående enhed af arbejde udført.



Det ser ud til, at man skal omskrive filen med en Truncate mulighed for at omskrive filen. det betyder at man skal åbne en ny FileStream hver gang de vil omskrive en fil. Så det ser ud til, at adfærd, jeg ønsker, kun kunne opnås ved en så beskidt måde:



  • Når programmet startes, skal du læse filen derefter åbne FileStream med FileShare.Read;

  • Når noget arbejde er færdigt, skal du lukke håndtaget åbnet tidligere, åbne en anden FileStream med FileMode.Truncate og FileShare.Read, skriv dataene og skyll FileStream.

  • Når noget arbejde er færdigt, skal du lukke håndtaget åbnet tidligere, åbne en anden FileStream med FileMode.Truncate og FileShare.Read, skriv dataene og skyll FileStream.

  • Dispose skal du lukke håndtaget åbnet tidligere.



En sådan måde har nogle ulemper: ekstra FileStream åbnes; filintegriteten garanteres ikke mellem FileStream tæt og FileStream åben; koden er meget mere kompliceret.
Er der nogen anden måde, mangler disse ulemper?

Bedste reference


Du må ikke lukke filen og genåbne filen. Brug i stedet FileStream.SetLength (0) til at afkorte filen til nul længde, når du vil omskrive den. [17]


Du må muligvis (eller måske ikke) også indstille FileStream.Position til nul. Dokumentationen gør det ikke klart, om SetLength flytter filmarkøren eller ej.

Andre referencer 1


Hvorfor tager du ikke den eksklusive adgang til filen, når programmet starter, og opretter en cache i hukommelsen af ​​filen, der kan deles på tværs af alle tråde i processen, mens din aktuelle fil forbliver låst til OS. Du kan bruge lås (memoryStream ) for at undgå samtidige problemer. Når du er færdig med at opdatere den lokale i-hukommelsesversion af filen, skal du bare opdatere filen på disken og frigive lås på den.


Hilsen.