ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Comment savoir si un fichier est ouvert   



L'auteur

Gregory Adam
Belgique Belgique
Membre Actif (personne physique)
# 0000001121
enregistré le 04/06/2006

Fiche personnelle


Note des membres
pas de note

Contributions > 05 - API et appels systèmes

Comment savoir si un fichier est ouvert
# 0000000469
ajouté le 23/08/2007 13:37:17 et modifié le 23/08/2007
consulté 10485 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0
VFP 5.0
VFP 3.0

Description

 

Ce n'est pas facile de savoir si un fichier est ouvert quelque part. 

Par exemple, si un fichier pdf est ouvert, le fopen() normal marchera, alors que le fopen(..., 12) ne marchera pas

Le probleme devient plus complexe quand le meme nom est inclus dans l'exe.  Un fopen() normal marchera, pendant qu'un fopen(.., 12) ne marchera pas.  Il me semble que vfp cherche d'abord parmi les fichiers inclus plutot que d'aller voir dans le chemin indique (eg \tmp\html.css , vfp cherche d'abord html.css 'inclus')

 Suggestion: la fonction FileOpened() qui va essayer d'ouvrir le fichier en lecture-seule + exclusif

 

A noter que quelques applis soient (1) ouvrent et referment de fichier de suite, eg un fichier .gif ouvert par l'explorateur internet, ou (2) font d'abord une copie, eg un fichier txt ouvert par NotePad.  Dans ces cas, ni fopen(..,12) ni FileOpened() peuvent le detecter

Code source :
*---------------------------------------------------------------------------
#IFNDEF  TRUE
  #define  TRUE  .T.
  #define  FALSE  .F.

  #define  MAX_INTEGER  (0x7fffffff)
#ENDIF

#ifndef VOID

  #define T_HANDLE  long
  #define LPCTSTR    String @
  #define  DWORD    Long
  #define  LPSECURITY_ATTRIBUTES  string @


  #define VOID

#endif
#define  GENERIC_READ        (0x80000000)
#define INVALID_HANDLE_VALUE    (-1)
#define INVALID_FILE_ATTRIBUTES    (-1)
#define  OPEN_EXISTING        3
#define  FILE_ATTRIBUTE_NORMAL    0x00000080

function FileOpened( FileName )

  declare T_HANDLE CreateFile in Kernel32.dll ;
      LPCTSTR FileName, ;
      DWORD dwDesiredAccess, ;
      DWORD dwShareMode, ;
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, ;
      DWORD dwCreationDisposition, ;
      DWORD dwFlagsAndAttributes, ;
      T_HANDLE hTemplateFile

  declare Integer GetFileAttributes in win32api string @
  declare integer CloseHandle in win32api long Handle

  local Handle

  Handle = CreateFile( ;
            @m.FileName, ;
            GENERIC_READ, ;
            0, ;        && excl access
            0, ;
            OPEN_EXISTING, ;
            FILE_ATTRIBUTE_NORMAL, ;
            0 ;
        )

  do case
  case (m.Handle = INVALID_HANDLE_VALUE )
    return FileExists(m.FileName)

  otherwise
    =CloseHandle(m.Handle)
    return FALSE

  endcase
endfunc
*---------------------------------------------------------------------------
Function  FileExists(FileName)

  return  inlist(vartype(m.FileName), T_CHARACTER) ;
    and  (GetFileAttributes(@m.FileName) <> INVALID_FILE_ATTRIBUTES)

endfunc
*--------------------------------------------------------------------------
Commentaires
Aucun commentaire enregistré ...

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3