Détecter si un fichier est déjà ouvert; en mode exclusif

Signaler
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
28 juillet 2009
-
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
28 juillet 2009
-
Bonjour

Question probablement déjà posée mille fois toutefois je ne trouve aucune source (ni sur Codyx ni sur Google) : comment puis-je savoir si un fichier est déjà ouvert en mode Exclusif ?

Le code ci-dessous (pas de moi) fonctionne très bien afin de savoir si un fichier est déjà ouvert ou pas.  Toutefois, je souhaite aller plus loin : j'ai développé une application VB6 qui utilise un DB de type MS Access.   J'ai 400 utilisateurs potentiels et il arrive que j'en ai plus de cinquante concurrents.   Pour éviter que ma DB explose, j'en fais cinq copies le matin et l'interface VB interroge, au hasard, une des cinq copies.   C'est ma façon à moi de faire du load balancing à moindre frais (ceci parce que je n'ai pas encore eu la possibilité de migrer vers quelque chose de plus stable que MS Access).

Mon problème est le suivant : si une des DB est ouverte en mode exclusif, le programme plante.   Que la DB soit ouverte importe peu, un utilisateur en plus n'est pas un problème.   Toutefois si la DB est ouverte en mode exclusif, là c'est pas bon.

Auriez-vous une idée ?







Private Declare Function lopen Lib "kernel32" Alias "_lopen" _
   (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long

Private Declare Function lclose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long

Function IsFileOpened(ByVal sFileName As String) As Boolean

   ' Initialize file handle and error variable.
   
   lastErr = 0

   ' Open for for read and exclusive sharing.
   
   hFile = lopen(sFileName, &H10)

   ' If we couldn't open the file, get the last error.
   
   If hFile = -1 Then
      lastErr = Err.LastDllError
   Else
      ' Make sure we close the file on success.
      lclose (hFile)
   End If

   ' Check for sharing violation error.
   
   IsFileOpened = ((hFile = -1) And (lastErr = 32))

End Function
 
(Coloration syntaxique automatique par Kenji)



Christophe

2 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
ajoutes un

On Error

si le programme plante avec ta DB, tu le saura... a toi d'interpreter le Err.Number

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
28 juillet 2009
1
Merci Renfield toutefois je préférerais un truc plus "propre".  

En outre, cela risque de rendre un peu plus long ma procédure.  Je m'explique : lors du lancement de mon programme, je scanne le folder où j'ai mes cinq DB; ceci afin de savoir combien il y a de DBs (cinq aujourd'hui mais peut-être plus demain).    Pour chaque fichier, j'aimerais détecter très rapidement si il est ouvert en mode exclusif.

Ce que j'ai déjà fait et c'est un peu ce que tu proposes, c'est d'ouvrir chaque base de données avec MS Access.  Si cela ne marche pas (on error) alors ce que quelqu'un a ouvert la DB en mode exclusif => je skippe ce fichier.

Toutefois, c'est horriblement lent.   C'est pourquoi je tente de trouver un code plus rapide; peut-être basé sur une API et pas sur MSAccess.

Merci pour ta proposition

Christophe