lire un fichier texte utilisé par un autre processus

lire un fichier texte utilisé par un autre processus - C#/.NET managed - Programmation

Marsh Posté le 05-04-2008 à 17:52:18    

hello
 
voila mon souci:
 
un serveur de jeu cree un fichier et ecrit dedans... moi je veux lire ce fichier
donc en toute logique j'ai fais un simple  

Code :
  1. File.ReadAllLines(fichier);


qui me retourne un tableau de string pour chaque ligne
super ça marche
 
je lance le serveur, et boum ça marche plus. logique le serveur utilise ce fichier pour y stoquer des donnnées
seulement je viens de me rendre compte que si mon programme ne peut pas lire le fichier, NOTEPAD.EXE lui le peut
je vois mal notepad comme une appli genial super cool qui outrepasse les securité de windows
 
donc voila ma question:
comment s'y prend le notepad pour lire le fichier alors que mon appli se mange une exception?
 
 
ps: une de mes solutions consiste à copier ce fichier (la copie avec File.Copy() marche meme si le fichier est deja utilise) mais il est gros et donc ça fait lagguer le serveur..


---------------
mon feedback: http://forum.hardware.fr/hfr/Achat [...] 8120_1.htm
Reply

Marsh Posté le 05-04-2008 à 17:52:18   

Reply

Marsh Posté le 06-04-2008 à 02:27:11    

File.ReadAllLines() est un peu bourrin, et demande un accès exclusif au fichier pour tourner.
 
Il te faut donc passer par un FileStream, qui va te permettre de choisir les accès que tu veux t'accaparer, et ceux que tu admets pendant ton utilisation du fichier.
 
En gros, tu vas t'accaparer "Read" uniquement, et accepter "Read/Write".
 
Attention cependant, c'est pas forcément très heureux de manipuler un fichier qui est modifié par un autre process.

Reply

Marsh Posté le 06-04-2008 à 02:54:06    

Par exemple :

Code :
  1. using System;
  2. using System.Windows.Forms;
  3. using System.IO;
  4. using System.Text;
  5.  
  6. namespace SandBox
  7. {
  8.    public partial class Form1 : Form
  9.    {
  10.        FileStream sr;
  11.        Timer t;
  12.        const int BUFFER_SIZE = 8192;
  13.  
  14.        public Form1()
  15.        {
  16.            InitializeComponent();
  17.            
  18.            sr = new FileStream("c:\\in\\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  19.  
  20.            t = new Timer();
  21.            t.Interval = 2000;
  22.            t.Tick += new EventHandler(t_Tick);
  23.  
  24.            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
  25.        }
  26.  
  27.        private void button1_Click(object sender, EventArgs e)
  28.        {
  29.            if (!t.Enabled)
  30.            {
  31.                t.Start();
  32.            }
  33.            else
  34.            {
  35.                sr.Seek(0, SeekOrigin.Begin);
  36.                textBox1.Text = string.Empty;
  37.                t.Stop();
  38.            }
  39.        }
  40.  
  41.        private void t_Tick(object sender, EventArgs e)
  42.        {
  43.            byte[] buff = new byte[BUFFER_SIZE];
  44.            int read = 0;
  45.            while (true)
  46.            {
  47.                read = sr.Read(buff, 0, BUFFER_SIZE);
  48.                if (read == 0) break;
  49.                textBox1.Text += Encoding.Default.GetString(buff, 0, read);
  50.            }
  51.        }
  52.  
  53.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  54.        {
  55.            try
  56.            {
  57.                if (t.Enabled) t.Stop();
  58.                sr.Close();
  59.            }
  60.            finally
  61.            {
  62.                sr.Dispose();
  63.            }
  64.        }
  65.    }
  66. }


 
Ca marche avec un fichier texte que je modifie depuis Notepad. Lorsque j'enregistre avec notepad, j'ai bien ma textbox qui s'allimente avec les modifications.
 
Attention toutefois, comme je dis, c'est mal dans le cas où ton fichier rétréchis. Dans mon cas, tu ne verras rien tant que je fichier n'aura pas de nouveau dépassé la dernière taille connue, et seulement ce qui dépasse de cette taille sera visible.
 
en gros, si j'ai dans mon fichier au début :
 


toto va à la plage


 
puis que je modifie en :
 


toto va à la ville faire des courses


 
Ca donne :
 


toto va à la plage faire des courses


Message édité par MagicBuzz le 06-04-2008 à 02:59:16
Reply

Marsh Posté le 06-04-2008 à 12:57:34    

ok  
j'avais essayé avec un filestream justement, mais j'avais pas mis le parametres FileShare.ReadWrite
 
merci en tout cas, je testerai ça tout a l'heure :)


---------------
mon feedback: http://forum.hardware.fr/hfr/Achat [...] 8120_1.htm
Reply

Marsh Posté le 06-04-2008 à 13:14:05    

ps: mon fichier ne retrecis pas! il augmente plutot ^^ donc ça gene pas ta solution ^^


---------------
mon feedback: http://forum.hardware.fr/hfr/Achat [...] 8120_1.htm
Reply

Marsh Posté le 06-04-2008 à 19:49:44    

le problème, c'est pas trop qu'il rétrécisse ou non, c'est surtout que ce qui est écrit dedans, il ne faut plus jamais y toucher, uniquement rajouter des trucs à la fin (écritures en append uniquement)

Reply

Marsh Posté le 07-04-2008 à 23:01:40    

yep
j'ai testé ça marche super bien :)
 
ce que je fais de toute maniere c'est just lire les dernier caracteres du fichier (1000 derniers caracteres) donc je teste juste la taille et zou
j'ecris pas dedans :)
 
merci en tout cas


---------------
mon feedback: http://forum.hardware.fr/hfr/Achat [...] 8120_1.htm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed