Python: 使用ctypes从缓冲区提取数据

4
我可以用Python中的ctypes成功调用函数。现在我有一个填充了数据结构的缓冲区,我想要提取这些数据。最好的策略是什么?还有什么其他需要发布的内容吗?
函数:
class list():
    def __init__(self):
        #[...]

    def getdirentries(self, path):
        self.load_c()
        self.fd = os.open(path, os.O_RDONLY)
        self.statinfo = os.fstat(self.fd)
        self.buffer = ctypes.create_string_buffer(self.statinfo.st_size)
        nbytes = self.statinfo.st_size

        transferred_bytes = self.libc.getdirentries(
                        self.fd,
                        ctypes.byref(self.buffer),
                        nbytes,
                        ctypes.byref(self.basep)  )

    #[...]

结构:

class dirent(ctypes.Structure):
    _fields_ = [ ("d_fileno", ctypes.c_uint32), # /* file number of entry */
                 ("d_reclen", ctypes.c_uint16), # /* length of this record */
                 ("d_type", ctypes.c_uint8), # /* file type */
                 ("d_namlen", ctypes.c_uint8), # /* length of string in d_name */
                 ("d_name", ctypes.c_char * (MAXNAMELEN + 1) ) ]

输出如下:
已传输字节数:156
缓冲区大小:272
缓冲区内容:<ctypes.c_char_Array_272 object at 0x8c3f0>


如果我表达不清楚,缓冲区中将保存一些dirent()结构。我可以使用第一个dirent.d_reclen来确定self.buffer中第一个dirent()结构的大小。我还应该使用self.basep索引通过lseek(3)遍历结构。那么,我该如何获取第一个缓冲区条目呢?谢谢! - user191270
1个回答

0

我想知道为什么你使用os.stat()而不是调用statinfo,以及为什么使用os.path.walk()而不是调用getdirentries?

通常,当您有要在C中传入和传出的数据缓冲区时,您会使用struct模块的pack和unpack方法来完成此操作。


我对实际检查目录条目本身而不是遍历目录很感兴趣。至于os.stat,我正在使用os.fstat,因为FD已经打开。有更好的方法来确定目录条目的大小吗?谢谢! - user191270
“目录大小”是什么意思?你指的是用于存储目录数据的字节数,目录中条目的数量还是用于存储目录中所有非目录条目的总字节数?对于最后一个问题,请参见 http://code.activestate.com/recipes/86554/ 以获取一些想法。我不确定它是否可以正常处理链接,即在类Unix系统上具有相同i节点号的两个文件,但对于Windows来说这不是问题。没有比浏览每个条目并总结文件大小更好的方法来获取目录中所有文件的总字节数。 - Michael Dillon
存储目录数据所使用的字节数。 - user191270
我使用了未打包的和ctypes结构来存储数据(这有点冗余,但没关系)。工作得很好,感谢您的建议! - user191270

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接