2010-05-28 3 views
5

Utilizzando le API I/O del file Win32 standard (CreateFile/ReadFile/etc), sto cercando di attendere che un file diventi leggibile o che si verifichi un'eccezione nel file. Se Windows ha avuto alcun supporto POSIX decente, ho potuto solo fare:Win32 select/poll/eof/ANYTHING?

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

E selezionare tornerà quando c'è qualcosa di interessante su alcuni dei file. Windows non supporta selezione o sondaggio. Belle. Ho immaginato di poter prendere il file e fare qualcosa del tipo:

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

Il ciclo precedente usciva quando sono disponibili più dati da leggere. Ma no, Windows non ha nemmeno l'equivalente di eof()! Potrei eventualmente chiamare ReadFile() sul file e determinare se è all'eof in questo modo. Ma, in quel momento, dovrei gestire la lettura - spero di essere semplicemente in grado di capire che un file è leggibile, senza leggerlo.

Quali sono le mie opzioni?

risposta

7

Windows ha un'architettura completamente diversa per l'I/O asincrono. Sarà necessario utilizzare overlapped I/O con o senza il relativo I/O completion ports.

Si noti che l'interfaccia Winsock standard ha una funzione select() simile a POSIX, ma funziona solo con socket di rete.

+1

Wow odio Windows. Tutto ciò che dovrebbe essere semplice non lo è. Non esiste davvero un tipo di funzione 'GetEndOfFile'? Vedo che c'è un SetEndOfFile :( – Andrew

+2

@Andrew, Windows non è conforme a POSIX – CMircea

+0

Diverso non significa inferiore, ovviamente con un modello alcune cose potrebbero essere più semplici e altre più complicate. Devi solo pensare alla stessa cosa da un prospettiva diversa –