2010-05-28 8 views
5

En utilisant l'API d'E/S de fichier Win32 standard (CreateFile/ReadFile/etc), j'essaie d'attendre qu'un fichier devienne lisible ou qu'une exception se produise sur le fichier. Si Windows a un soutien POSIX décent, je pouvais faire:Win32 select/poll/eof/RIEN?

select(file_count, files_waiting_for_read, NULL, files_waiting_for_excpt, NULL, NULL); 

et sélectionnez retournera quand il y a quelque chose d'intéressant sur certains fichiers. Windows ne prend pas en charge la sélection ou l'interrogation. Bien. J'ai pensé que je pourrais prendre le dossier et faire quelque chose comme:

while(eof(file_descriptor)) 
{ 
    Sleep(100); 
} 

La boucle ci-dessus sortirait quand plus de données sont disponibles pour être lues. Mais non, Windows n'a pas non plus d'équivalent de eof()! Je pourrais éventuellement appeler ReadFile() sur le fichier, et déterminer si c'est à l'eof de cette façon. Mais, alors je devrais gérer la lecture à ce moment-là - j'espère être simplement en mesure de comprendre qu'un fichier est lisible, sans vraiment le lire.

Quelles sont mes options?

Répondre

7

Windows a une architecture complètement différente pour les E/S asynchrones. Vous devrez utiliser overlapped I/O avec ou sans les I/O completion ports associés.

Notez que l'interface Winsock standard dispose d'une fonction select() de type POSIX, mais cela ne fonctionne qu'avec les sockets réseau.

+1

Wow, je déteste Windows. Tout ce qui devrait être simple n'est pas. N'y a-t-il vraiment pas de type de fonction 'GetEndOfFile'? Je vois qu'il y a un SetEndOfFile :( – Andrew

+2

@Andrew, Windows n'est pas compatible POSIX – CMircea

+0

Différent ne veut pas dire inférieur, évidemment avec un modèle, certaines choses peuvent être plus simples et d'autres plus compliquées, il suffit de penser à la même chose –