2009-10-16 15 views
4

Can CreateFile() Ouvrir un fichier en même temps dans deux thread différentCan CreateFile() Ouvrir un fichier en même temps dans deux thread différent


void new_function(void * what) {

HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | 
        FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

if (h == INVALID_HANDLE_VALUE) 
{ 
    DWORD d = GetLastError(); 
    return ; 
} 
Sleep(10000); 

}

int main() {

HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

Sleep(10000); 
return 1; 

}


chaque fois qu'il sort à la position GetLastError. et l'erreur est ERROR_SHARING_VIOLATION (32, « Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus . »)

si je CANOT partage ouvrir le fichier, alors quel est l'utilisation du FILE_SHARE_WRITE | FILE_SHARE_READ

Thanx

The program environment is Win32 Vs2003

+0

Vous devez indiquer quelle langue, quel système d'exploitation et quelle version. –

+0

On dirait C pour moi. CreateFile est une API Win32(). Vous auriez aimé qu'il le marque mieux ... Il est un utilisateur de réputation 63 qui a rejoint il ya 24 jours. Soyez paisible. Merci de l'avoir repermé. –

Répondre

9

Le descripteur de fichier est toujours partagé entre les threads. Tout ce que vous devrez faire est simplement d'utiliser la poignée comme d'habitude, mais sur deux threads.

Votre deuxième appel à CreateFile() échoue car vous demandez plus d'accès, GENERIC_ALL, que vous autorisez l'accès partagé, FILE_SHARE_WRITE | FILE_SHARE_READ.

Si vous demandiez à la place seulement GENERIC_READ | GENERIC_WRITE, il réussirait.

Le comportement CreateFile() sera le même si vous l'appelez sur un seul thread.

+0

Thanx beaucoup ......... je change 'GENERIC_ALL' à' GENERIC_READ | GENERIC_WRITE'. j'obtiens la bonne réponse –

+1

Aussi vous pouvez ajouter FILE_SHARE_DELETE. Cela dépend de ce que vous voulez de votre fichier. –

+1

Vous ne devez pas ajouter FILE_SHARE_DELETE, car vous souhaitez demander le minimum de privilèges requis. –