[ Oliver Klaćik @ 09.02.2006. 17:27 ] @
Imam Windows Service koji nadgleda neki folder i kada se pojavi odgovarajući fajl treba da ga prebaci (Move) na drugu lokaciju. E, sad, FileSystemWatcher diže Created event, kada fajl počne da se kreira i naredba Move u tom trenutku izaziva Exception, a baš taj eception pada u jednu širu grupu IOExcetion klase, što znači da ne mogu uvek biti siguran da sam baš taj exception uhvatio. Evo kako sam rešio problem:

Code:

Dim Success As Boolean

        ' While Success flag is false...
        While Success = False

            ' Try..Catch block that catches possible IOExceptions including 'The process cannot access the file...'
            Try
                ' Hope for the best...
                Success = True

                ' ...and try to move the file
                File.Move(sourcePath, destPath)

                ' Catch IO type of exception
            Catch ex As IOException

                If ex.Message.StartsWith("The process cannot access the file") = False Then
                    ' TODO: Write log and trace entries
                Else
                    ' If this is 'expected kind of exception' set flag to false to continue the loop
                    Success = False
                End If
                ' Catch some general exceptions
            Catch ex As Exception
                ' TODO: Write log and trace entries
            End Try
        End While


Ovo radi, ali mi se jednostavno ne sviđa. Grešku hvata preko Message property-ja, što je bezveze jer je taj property podložan lokalizaciji .Net Framework-a.

Znači, interesuje me:

1. Da li mogu na neku foru da saznam kada je file slobodan, tj. da nijedan drugi proces ne drži lock na njemu, ili jednostavno kada je proces kreiranja gotov?

2. Da li mogu da na neki bezbedniji način uhvatim 'pravi' exception. Jedino što mi ovde deluje kao mogućnost je da nasledim IOException klasu, pa da preko HResult property-ja uhvatim kod te greške. Ali to još nisam probao, tako da ne znam da li je moguće.

Ima li neko ideju?
[ mmix @ 09.02.2006. 20:16 ] @
Ja se stalno bijem sa ovim problemom posto cesto radim ovu "swivel chair" integraciju izmedju dva legacy sistema.

Ono sto mi radimo je inicijalizacija novog thread-a kome se prosledi file name. Thread saceka XX sekundi (nase pravilo je 3 x prosecno vreme kreirnja fajla, min 20 sek) i onda uradi move.
Problem je sto filewatcher ne salje Close event , a i da salje, mi imamo pacijente koji rade jedan create pa 1000 appendova za svaki red flat file-a, pa nam ni to ne vredi
[ Oliver Klaćik @ 09.02.2006. 23:45 ] @
Dobio sam funkcionalno ali i komplikovano rešenje na drugom forumu (da, znam, baš sam izdajnik ), pa ako nekoga interesuje evo link:
http://forums.microsoft.com/MS...spx?PostID=240640&SiteID=1

Inače, ovo je definitivno jedan od propusta Microsoft-a u dizajnu base klasa .Net Framework-a.