bonjour,
il y a plusieurs années j'ai développé un service windows en Delphi qui scrute un répertoire tous les 5 secondes (c:\dataExchange\DataIn), recherche un fichier nommé priority.csv.
Si ce fichier existe, il ouvre ce fichier et lit tous les fichiers de données à traiter. (fichiers csv stockés dans le même répertoire)
Le traitement consiste à charger des données en mémoiren les analyser et à lancer un exe en C++. (méthode CreateProcess et WaitForSingleObject) puis suppression du fichier d'entrée de données
Une fois que toutes les données d'entrées sont traitées, le fichier priority.csv est supprimé.
ce mécanisme marche parfaitement sauf de temps en temps avec le message d'erreur suivant dans une boite de dialogue:
Impossible d'ouvrir le fichier "c:\DataExchange\DataIn\Priority.csv". Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus.
Comment faire pour ne pas avoir de boite de dialogue qui bloque le process?
J'ai analysé que c'est une exception de type EFOpenError qui est déclenchée sur la ligne suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 VAR List, Items : TStringList; I, J : Integer; BEGIN {On crée dynamiquement la liste qui va contenir les lignes du fichier} List := TStringList.Create; TRY IF FileExists(FileName) THEN BEGIN {On charge le fichier} List.LoadFromFile(FileName); // Exception ici {On détruit les lignes vides ou commencant par #} IF EraseRow THEN CleanList(List); {On initialise le tableau} SetLength(CsvExtract.TabResult, 0, List.Count); {On fait toutes les lignes du fichier} FOR I := 0 TO List.Count - 1 DO BEGIN {On recupere les différents champ de la ligne} Items := RecupItems(List.Strings[I]); TRY {On définit la taille du tableau} IF High(CsvExtract.TabResult) < Items.Count THEN SetLength(CsvExtract.TabResult, Items.Count, List.Count); {On ajoute les lignes de la liste au tableau} FOR J := 0 TO Items.Count - 1 DO CsvExtract.TabResult[J, I] := Items.Strings[J]; FINALLY Items.Free; END; END; END ELSE ShowMessage('Le chemin suivant : "' + FileName + '" n''est pas valide.'); FINALLY {On détruit le tstringlist pour libérer la mémoire} List.Free; END; END;
Partager