Supprimer un fichier ouvert pour un access exclusif dans le même processus

Mon programme Windows reçoit des informations d’un autre programme via l’interface de répertoire / fichier. C’est-à-dire que l’autre programme dépose des fichiers dans un répertoire spécial. Mon programme parsing périodiquement le répertoire, trouve les fichiers, les traite et les supprime.

J’utilise la fonction CreateFile () pour ouvrir ces fichiers. Pour vous assurer que l’autre programme a fini d’écrire dans le fichier et de le fermer, je mets le paramètre dwShareMode à 0. Si CreateFile échoue avec une erreur de partage, je passe simplement le fichier à la prochaine itération.

Le problème est que DeleteFile () échoue avec l’erreur ERROR_SHARING_VIOLATION lors de l’ouverture du fichier par mon programme.

Je pourrais fermer le fichier avant de le supprimer, mais je voudrais éviter que d’autres programmes ouvrent le fichier juste avant de supprimer le fichier.

J’utilise ce code pour ouvrir des fichiers

CreateFile(filePath,DELETE|FILE_READ_DATA,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) 

Est-il possible de réaliser ce que je veux: ouvrir le fichier exclusivement et ensuite le supprimer, de sorte qu’aucun autre programme ne puisse interférer entre l’ouverture et la suppression du fichier.

Transmettez FILE_SHARE_DELETE pour dwShareMode. Notez que cela permettra toujours à d’autres applications (ainsi qu’à la vôtre) d’appeler DeleteFile () pendant que vous lisez le fichier, mais selon la documentation de DeleteFile (), elle ne sera pas supprimée tant que vous n’aurez pas fermé CloseHandle votre poignée de lecture.

La fonction DeleteFile marque un fichier à supprimer à la fermeture. Par conséquent, la suppression du fichier ne se produit pas tant que le dernier handle du fichier n’est pas fermé. Les appels suivants à CreateFile pour ouvrir le fichier échouent avec ERROR_ACCESS_DENIED.

Les autres applications ne pourront pas lire ou écrire le fichier tant que vous ne spécifiez pas respectivement FILE_SHARE_READ ou FILE_SHARE_WRITE. Bien qu’avec FILE_SHARE_DELETE alors peut déplacer le fichier, mais ce serait le.

FILE_FLAG_DELETE_ON_CLOSE est probablement ce que vous recherchez. À partir de MSDN

* FILE_FLAG_DELETE_ON_CLOSE 0x04000000 – Le fichier doit être supprimé immédiatement après la fermeture de tous ses descripteurs, ce qui inclut le descripteur spécifié et tous les autres descripteurs ouverts ou dupliqués. S’il existe des descripteurs ouverts dans un fichier, l’appel échoue sauf s’ils ont tous été ouverts avec le mode de partage FILE_SHARE_DELETE. Les demandes ouvertes suivantes pour le fichier échouent, à moins que le mode de partage FILE_SHARE_DELETE ne soit spécifié. *

EDIT: ajouté un exemple …

Donc, dans votre cas, vous devriez:

 HANDLE hFile = ::CreateFile(filePath, DELETE|FILE_READ_DATA, 0, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); //use the file... ::CloseHandle(hFile); //the file gets deleted when the handle is closed