FileSystemWatcher: Chemin d'accès trop long fait planter mon programme.
Bonsoir à tous,
Pouvez vous m'aider à corriger un bug ? Je traîne celui-ci depuis 2 ans et j'ai enfin décider d'y regarder de plus prêt :
J'ai grosso-modo un plantage par jour et pour vérifier j'ai placé un bloc Try/Catch et tracé l'erreur vers mon fichier trace.log.
Donc forcement je n'ai plus de plantage mais en contre partie je ne traite pas l'exception : Visiblement il s'agit de chemin trop long qui sont interceptés par FileSystemWatcher.
Déjà je m’étonne que FileSystemWatcher puisse voir ce genre de chemin mais admettons. Ce qui m’étonne aussi c'est que FileSystemWatcher vois des chemins avec des noms de dossiers tronqués avec des "~" : du style "M:\Mon Chem~Trop Long" pour "M:\Mon Chemin Est Trop Long" par exemple.
Pour moi ces chemins ne sont pas valide donc je n'ai aucune raison de les traiter mais je serais très intéressé d'avoir votre avis sur la question si vous avez déjà été confronté au problème.
Voici ce que mon trace.log me dit (voir lignes 40158 et 40166) :
Citation:
[40153] 11:01:56 587 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\11F3DF40.tmp" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40154] 11:01:56 754 -Verbose- [X_project.modFswTag/ UpdatePaths] => L'extension du fichier "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\11F3DF40.tmp" est rejetée par le filtre, celui-ci est ignoré par UpdatePath
[40155] 11:01:57 75 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\11F3DF40.tmp" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40156] 11:01:57 216 -Verbose- [X_project.modFswTag/ UpdatePaths] => L'extension du fichier "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\11F3DF40.tmp" est rejetée par le filtre, celui-ci est ignoré par UpdatePath
[40157] 11:01:57 528 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\E195D641.tmp" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40158] 11:01:57 871 -Critical- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de*260*caractères et le nom du répertoire moins de 248*caractères. à System.IO.PathHelper.Append(Char value)
à System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
à System.IO.Path.GetPathRoot(String path)
à System.IO.RenamedEventArgs.get_OldFullPath()
à X_project.modFswTag.PathInfos..ctor(FileSystemEventArgs e)
à X_project.modFswTag.ProcessFileSystemEvents()
[40159] 11:01:57 871 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\E195D641.tmp" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40160] 11:01:58 27 -Verbose- [X_project.modFswTag/ UpdatePaths] => L'extension du fichier "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\E195D641.tmp" est rejetée par le filtre, celui-ci est ignoré par UpdatePath
[40161] 11:01:58 27 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\11F3DF40.tmp" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40162] 11:01:58 167 -Verbose- [X_project.modFswTag/ UpdatePaths] => L'extension du fichier "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\11F3DF40.tmp" est rejetée par le filtre, celui-ci est ignoré par UpdatePath
[40163] 11:01:58 167 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40164] 11:01:58 323 -Verbose- [X_project.modFswTag/ UpdatePaths] => Un attribut du dossier "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2" a changé, celui-ci est ignoré par UpdatePath
[40165] 11:01:58 323 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\9505-FDT-509 FE SSI Phase 1 Câbles Arret Technique COM2 BUS2 Local SD45.doc" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
[40166] 11:01:58 464 -Critical- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier qualifié complet doit comprendre moins de*260*caractères et le nom du répertoire moins de 248*caractères. à System.IO.PathHelper.Append(Char value)
à System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
à System.IO.Path.GetFullPathInternal(String path)
à System.IO.FileInfo.Init(String fileName, Boolean checkHost)
à System.IO.FileInfo..ctor(String fileName)
à X_project.modFswTag.PathInfos..ctor(FileSystemEventArgs e)
à X_project.modFswTag.ProcessFileSystemEvents()
[40167] 11:01:58 464 -Verbose- [X_project.modFswTag/ ProcessFileSystemEvents] => Le chemin "M:\AAQ2~4.095\2-Etudes\DT4~1.85-\2-3DOE~1\5CERTI~1\5FB1F~1.2FI\FICHED~2\9505-FDT-509 FE SSI Phase 1 Câbles Arret Technique COM2 BUS2 Local SD45.doc" (stocké dans le buffer par FsWatcher) va être traité par le thread [9] <ProcessFileSystemEventsArg>
L'objet _fileSystemEvents alimenté par les événements de FileSystemWatcher :
Code:
Private _fileSystemEvents As New ConcurrentQueue(Of FileSystemEventArgs)()
La procédure ou j'ai mis un bloc Try / Catch :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
Module modFswTag
......
Private Sub ProcessFileSystemEvents()
Thread.CurrentThread.Name = ("ProcessFileSystemEventsArg")
While Not _stopRequested
Dim e As FileSystemEventArgs = Nothing
' Traiter l'évènement
''''
If _fileSystemEvents.TryDequeue(e) Then
Mysource1.TraceEvent(TraceEventType.Verbose, 0, String.Format("Le chemin ""{0}"" (stocké dans le buffer par FsWatcher) va être traité par le thread [{1}] <{2}>", e.FullPath, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.Name))
Try
Dim PathInfo As New PathInfos(e)
UpdatePaths(PathInfo)
Catch ex As Exception
Mysource1.TraceEvent(TraceEventType.Critical, 0, ex.Message & ex.StackTrace)
End Try
Else
' rien dans la file, on attend un peu
Thread.Sleep(50)
End If
End While
End Sub
......
End Module |
Ma classe ou visiblement se produit l'erreur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
Module modFswTag
......
Public Class PathInfos
Public Sub New(ByVal e As FileSystemEventArgs)
Select Case e.ChangeType
Case WatcherChangeTypes.Changed
_EventType = EventsTag.FswChanged
Case WatcherChangeTypes.Created
_EventType = EventsTag.FswCreated
Case WatcherChangeTypes.Deleted
_EventType = EventsTag.FswDeleted
Case WatcherChangeTypes.Renamed
_EventType = EventsTag.FswRenamed
End Select
_Fi = New FileInfo(e.FullPath)
GetInfos(_Fi)
_Path = e.FullPath
_OldPath = Nothing
If TypeOf (e) Is RenamedEventArgs Then
Dim e1 As RenamedEventArgs = CType(e, RenamedEventArgs)
_OldPath = e1.OldFullPath
End If
End Sub
......
End Class
......
End Module |
Merci beaucoup, pour votre réponse.