2015-04-28 181 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 

即使文件明确包含更多数据,也不会打印“Hi”。 我的问题是如何确保我在不使用大型缓冲区的情况下阅读整个文件?

回答

0

正如已经观察到的那样,如果win32file.ReadFile结果值hr为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,如果没有采取相应的措施。