def read(self, buflen=-1): """ read file :param buflen: length of read buffer. If less than 0, then whole file is read. Default is -1. :returns: buffer of size buflen """ if buflen < 0: buflen = self.fgetsize() rbuf = ctypes.create_string_buffer(buflen) ret = api.glfs_read(self.fd, rbuf, buflen, 0) if ret > 0: return rbuf elif ret < 0: err = ctypes.get_errno() raise OSError(err, os.strerror(err)) else: return ret
def read(self, size=-1): """ Read at most size bytes from the file. :param buflen: length of read buffer. If less than 0, then whole file is read. Default is -1. :returns: buffer of 'size' length """ if size < 0: size = self.fgetsize() rbuf = ctypes.create_string_buffer(size) ret = api.glfs_read(self.fd, rbuf, size, 0) if ret > 0: # In python 2.x, read() always returns a string. It's really upto # the consumer to decode this string into whatever encoding it was # written with. return rbuf.value[:ret] elif ret < 0: err = ctypes.get_errno() raise OSError(err, os.strerror(err))
def readinto(self, buf): """ Read up to len(buf) bytes into buf which must be a bytearray. (buf cannot be a string as strings are immutable in python) This method is useful when you have to read a large file over multiple read calls. While read() allocates a buffer every time it's invoked, readinto() copies data to an already allocated buffer passed to it. :returns: the number of bytes read (0 for EOF). :raises: OSError on failure """ if type(buf) is bytearray: buf_ptr = (ctypes.c_ubyte * len(buf)).from_buffer(buf) else: # TODO: Allow reading other types such as array.array raise TypeError("buffer must of type bytearray") nread = api.glfs_read(self.fd, buf_ptr, len(buf_ptr), 0) if nread < 0: err = ctypes.get_errno() raise OSError(err, os.strerror(err)) return nread