Avatar billede lajer Nybegynder
23. december 2005 - 10:28 Der 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);
Avatar billede arne_v Ekspert
23. december 2005 - 10:36 #1
umiddelbart kan jeg kun se 2 tilgange:

1)  vente et par sekunder efter at have fået eventen

2)  catche exception vente of prøve igen
Avatar billede lajer Nybegynder
23. december 2005 - 10:40 #2
Det er også min midlertidige løsning - men jeg havde håbet at en lidt mere gyldig tilgangs måde var mulig.

Jeg lader spørgsmålet stå åbent lidt endnu, kan være der pludselig dumper et guldkorn ned.
Avatar billede dr_chaos Nybegynder
23. december 2005 - 10:52 #3
kan du ikke fyre en event når du er færdig med at kopiere filen ?
Avatar billede lajer Nybegynder
23. december 2005 - 10:53 #4
dr chaos - jo, men det er jo nærmest det spørgsmålet går på :-)

Hvordan vil du bære dig af med det?
Avatar billede dr_chaos Nybegynder
23. december 2005 - 10:59 #5
det kommer an på hvordan kopieringen foregår.
Er det noget du gør fra din applikation eller kopierer du dem manuelt ind i mappen ?
Avatar billede lajer Nybegynder
23. december 2005 - 11:12 #6
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.
Avatar billede dr_chaos Nybegynder
23. december 2005 - 12:08 #7
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();
                 
                    break;
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex);
                }
                System.Threading.Thread.Sleep(1000);
            }
            System.Diagnostics.Debug.WriteLine("færdig");
        }
Avatar billede dr_chaos Nybegynder
23. december 2005 - 12:10 #8
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.
Avatar billede lajer Nybegynder
23. december 2005 - 23:26 #9
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.

Smid et svar!

Smed iøvrigt en omgang karma efter dig :)
Avatar billede dr_chaos Nybegynder
24. december 2005 - 11:30 #10
svar :)
glad for at det virker.
Avatar billede arne_v Ekspert
24. december 2005 - 12:31 #11
jeg tror du skal ramme den lille cirkel ude til venstre nederst ...
Avatar billede dr_chaos Nybegynder
25. december 2005 - 10:05 #12
tror du har ret :)
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
Kurser inden for grundlæggende programmering

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