2015-04-28 2 views
2

Похожий вопрос:питон - прочитать файл, используя win32file.ReadFile

What's the correct way to use win32file.ReadFile to get the output from a pipe?

вопрос я однако был не ответил на этот вопрос. Когда я называю

result, data = win32file.ReadFile(my_file, 4096, None) 

результат всегда 0, который в соответствии с документацией означает успех:

The result is a tuple of (hr, string/PyOVERLAPPEDReadBuffer), where hr may be 0, 
ERROR_MORE_DATA or ERROR_IO_PENDING. 

Даже если я устанавливаю буфер до 10 и файл гораздо больше результат 0 и данные являются строка, содержащая первые 10 символов.

result, buf = win32file.ReadFile(self._handle, 10, None) 
while result == winerror.ERROR_MORE_DATA:    
    result, data = win32file.ReadFile(self._handle, 2048, None) 
    buf += data 
    print "Hi" 
return result, buf 

«Привет» никогда не печатается, даже если файл явно содержит больше данных. Проблема у меня есть, как я могу убедиться, что я читаю весь файл без использования смешного большого буфера?

ответ

0

Как уже отмечалось, если значение win32file.ReadFilehr равно 0, то это означает успех. Это точно противоположно документации win32 api, в которой указано, что 0 означает, что произошла ошибка.

Чтобы определить, сколько байтов было прочитано, вам нужно проверить длину возвращаемой строки. Если размер такого же размера, как размер буфера, то может быть больше данных. Если меньше, то весь файл был прочитан:

def readLines(self): 
    bufSize = 4096 
    win32file.SetFilePointer(self._handle, 0, win32file.FILE_BEGIN) 
    result, data = win32file.ReadFile(self._handle, bufSize, None) 
    buf = data 
    while len(data) == bufSize:    
     result, data = win32file.ReadFile(self._handle, bufSize, None) 
     buf += data 
    return buf.split('\r\n') 

Вам нужно добавить обработку ошибок к этому, например. проверьте результат, если он на самом деле равен 0, и если не принять соответствующие меры.