23. december 2005 - 10:28Der er
11 kommentarer og 1 løsning
Lav FileStream af fil efter size changed
Hej
Jeg skal have lavet en FileStream af en fil, så snart filens størrelse ændres.
Til at holde styr på dette har jeg brugt FileSystemWatcher med NotifyFilter = NotifyFilters.Size.
Mit problem er at jeg for min FileSystemWatcher changed event for tidligt. Hvis det f.eks. er en word fil på et par mb. som blive ændret, så bliver eventen fyret før word er færdig med at gemme filen - derved er filen "låst".
Et andet scenerie er: hvis jeg kopiere en fil ind i den folder som min FileSystemWatcher holder øje med, så bliver eventen fyret så snart første byte er skrevet - jeg vil først have eventen fyret når filen ER færdigskrevet.
Er dette ikke muligt - eller er der nogen der har et snedigt forslag til hvordan man kan klarer sig udenom problemet!?
Jeg instanciere min FileStream således: m_CurrentStreamingFile = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
Kopieringen er ikke noget jeg styrer. F.eks. kunne "kopiering" også bare være en ændring efter at word har gemt en fil.
Her fyrer FileSystemWatcher så sin Changed event - og det er her at jeg har brug for, at denne event først bliver fyret når filen er færdig skrevet af word (eller hvad som helst andet program).
Changed eventen bliver ligeledes kørt, hvis jeg kopiere en fil via explorer ind til den mappe min FileSystemWatcher holder øje med - og igen opstår samme problem: min event bliver kørt før filen er færdig skrevet.
jeg har lavet en version som virker: det her er mit filesystemwatcher chnaged event: static void fsw_Changed(object sender, FileSystemEventArgs e) { System.IO.FileInfo curFile = new System.IO.FileInfo(e.FullPath); while (true) { try { System.IO.FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Close();
på denne måde forsøger den at åbne filen indtil den anden process har sluppet den. jeg indsatte System.Threading.Thread.Sleep(1000); for ikke at skabe overload i systemet.
Lidt samme princip som det hack jeg selv havde implementet. Her bruger jeg en Timer hvis Tick event bliver kørt hvert 2 sekond, hvis det ikke lykkes at lave streamen. I denne event disposer jeg timeren igen og kører metoden der forsøger at lave streamen.
Jeg vil dog mene at din idé er noget bedre udført, så det må blive måden fremover.
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.