Python - read file using win32file.ReadFile

A similar question:

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

However, in this question I did not answer. When i call

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

      

the result is always 0, which according to the documentation means success:

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

      

Even if I set the buffer to 10 and the file is much larger, the result is 0 and the data is a string containing the first 10 characters.

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

      

"Hello" is never printed even if the file clearly contains more data. The problem I have is how can I make sure I am reading the entire file without using a ridiculously large buffer?

+3


source to share


1 answer


As noted, if win32file.ReadFile

result hr

is 0, it means success. This is exactly the opposite of the win32 api documentation which says 0 means an error has occurred.

To determine how many bytes have been read, you need to check the length of the returned string. If the size is the same size as the buffer size, then there may be more data. If it is smaller, the entire file has been read:



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')

      

You need to add error handling eg. check the result if it actually equals 0 and if not take appropriate action.

0


source







All Articles