2010-02-02 14 views
1

Je dois vérifier si des fichiers d'un dossier sont ouverts par d'autres applications ou non. Malheureusement, si un fichier est ouvert, GetFileAttributesA() renvoie des valeurs incorrectes. Y at-il une solution de contournement pour cela ou est-ce que je fais quelque chose de mal?Comment vérifier si un fichier est ouvert

Répondre

1

GetFileAttributes n'a rien à voir avec le partage de fichiers. La seule façon de savoir si quelqu'un a ouvert le fichier (vous empêchant ainsi de l'ouvrir) est d'essayer de l'ouvrir vous-même.

bool IsFileOpenBySomeoneElse(LPCTSTR pszFilename) 
{ 
    HANDLE hfile = CreateFile(pszFilename, 
           GENERIC_READ /*| GENERIC_WRITE*/, 
           0, //0 is share-none 
           NULL, 
           OPEN_ALWAYS); 
    if (hfile != INVALID_HANDLE_VALUE) 
    { 
     CloseHandle(hfile); 
     return false; 
    } 
    return (GetLastError() == ERROR_SHARING_VIOLATION); 
} 

Mais écrire cette fonction ne vous pas, parce que le temps que vous vous déplacer à l'ouverture e fichier e pour le traitement, une autre application peut avoir le fichier ouvert.

Le seul moyen sûr de faire cela est de faire ce que vous avez l'intention de faire avec le fichier, et lorsque vous essayez de l'ouvrir pour le traitement, notez la valeur de l'erreur si vous échouez. Une fois que vous avez le fichier ouvert, vous devez le garder ouvert jusqu'à ce que vous avez terminé ou un autre processus peut l'ouvrir (ou le supprimer!) Derrière votre dos.

+0

Je suis d'accord avec le "share-none". Je ne suis pas d'accord avec le "GENERIC_READ | GENERIC_WRITE". Si CreateFile échoue parce que l'utilisateur n'a que l'autorisation de lecture ET que le fichier est également ouvert par quelqu'un d'autre, comment savez-vous si GetLastError donnera la priorité à ERROR_SHARING_VIOLATION? –

+0

@Windows Programmeur: bon point. mais si vous avez besoin d'un accès en écriture, vous en souciez-vous? Je suppose que cela dépend de la raison pour laquelle vous appelez cette fonction. –

+0

Pourquoi supposez-vous que Krishna a besoin d'un accès en écriture? La question ne l'a pas dit. –

Questions connexes