Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python获取fat32属性_Python_Linux_Fat32 - Fatal编程技术网

使用python获取fat32属性

使用python获取fat32属性,python,linux,fat32,Python,Linux,Fat32,如何在linux中获取fat32属性(如存档、隐藏…),而不使用fatattr实用程序调用生成新进程?它或linux/fs函数(fat\u ioctl\u get\u属性,)可能有python绑定。或者可以使用python xattr?正如您在函数名中看到的那样,内核函数fat\u ioctl\u get\u attributes是通过一个从用户空间调用的,我不知道有任何其他绑定。因此,您只需调用自己即可读取属性,如下所示: import array import fcntl import os

如何在linux中获取fat32属性(如存档、隐藏…),而不使用fatattr实用程序调用生成新进程?它或linux/fs函数(fat\u ioctl\u get\u属性,)可能有python绑定。或者可以使用python xattr?

正如您在函数名中看到的那样,内核函数
fat\u ioctl\u get\u attributes
是通过一个从用户空间调用的,我不知道有任何其他绑定。因此,您只需调用自己即可读取属性,如下所示:

import array
import fcntl
import os

FAT_IOCTL_GET_ATTRIBUTES = 0x80047210
FATATTR_BITS = 'rhsvda67'

def get_fat_attrs(fn):
    fd = os.open(fn, os.O_RDONLY)
    try:
        buf = array.array('L', [0])
        try:
            fcntl.ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, buf, True)
        except IOError as ioe:
            if ioe.errno == 25: # Not a FAT volume
                return None
            else:
                raise

        return buf[0]
    finally:
        os.close(fd)

if __name__ == '__main__':
    import sys
    for fn in sys.argv[1:]:
        attrv = get_fat_attrs(fn)
        if attrv is None:
            print(fn + ': Not on a FAT volume')
            continue
        s = ''.join((fb if (1 << idx) & attrv else ' ')
                    for idx,fb in enumerate(FATATTR_BITS))
        print(fn + ': ' + s)
导入数组
进口fcntl
导入操作系统
FAT\u IOCTL\u GET\u属性=0x80047210
FATATTR_位='rhsvda67'
def获取脂肪属性(fn):
fd=os.open(仅限fn、os.O)
尝试:
buf=array.array('L',[0])
尝试:
fcntl.ioctl(fd,FAT\u ioctl\u GET\u属性,buf,True)
除了作为ioe的IOError:
如果ioe.errno==25:#不是一个大容量
一无所获
其他:
提升
返回buf[0]
最后:
操作系统关闭(fd)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
对于sys.argv[1:]中的fn:
attrv=get\u fat\u attrs(fn)
如果attrv为None:
打印(fn+':不在胖卷上')
持续

s=''.join((fb if(1)正如您在函数名中所看到的,内核函数
fat\u ioctl\u get\u attributes
通过从用户空间调用,我不知道任何其他绑定。因此,您可以通过调用自己来读取属性,如下所示:

import array
import fcntl
import os

FAT_IOCTL_GET_ATTRIBUTES = 0x80047210
FATATTR_BITS = 'rhsvda67'

def get_fat_attrs(fn):
    fd = os.open(fn, os.O_RDONLY)
    try:
        buf = array.array('L', [0])
        try:
            fcntl.ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, buf, True)
        except IOError as ioe:
            if ioe.errno == 25: # Not a FAT volume
                return None
            else:
                raise

        return buf[0]
    finally:
        os.close(fd)

if __name__ == '__main__':
    import sys
    for fn in sys.argv[1:]:
        attrv = get_fat_attrs(fn)
        if attrv is None:
            print(fn + ': Not on a FAT volume')
            continue
        s = ''.join((fb if (1 << idx) & attrv else ' ')
                    for idx,fb in enumerate(FATATTR_BITS))
        print(fn + ': ' + s)
导入数组
进口fcntl
导入操作系统
FAT\u IOCTL\u GET\u属性=0x80047210
FATATTR_位='rhsvda67'
def获取脂肪属性(fn):
fd=os.open(仅限fn、os.O)
尝试:
buf=array.array('L',[0])
尝试:
fcntl.ioctl(fd,FAT\u ioctl\u GET\u属性,buf,True)
除了作为ioe的IOError:
如果ioe.errno==25:#不是一个大容量
一无所获
其他:
提升
返回buf[0]
最后:
操作系统关闭(fd)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
对于sys.argv[1:]中的fn:
attrv=get\u fat\u attrs(fn)
如果attrv为None:
打印(fn+':不在胖卷上')
持续

s=''.join((fb if(1)知道它是main之后为什么要导入sys?@Serdalis,因为在下一行中,这个演示程序会迭代整个程序,如果这个演示程序用作库,那么就不需要
sys
。我在考虑这个解决方案,但是你是如何得到函数地址的(FAT\u IOCTL\u GET\u ATTRIBUTES=0x80047210)?在我的发行版上,我收到错误“函数未实现”@user2260486这是一个奇怪的错误,因为ioctl编号是内核接口的一部分,因此不应该更改。在安装strace和fattr之后,您从
strace-e ioctl-e raw=ioctl fattr/
中得到了什么输出?
$uname--a
Linux deb7 3.2.0-4-amd64\1 SMP Debian 3.2.35-2 x86\u 64 GNU/Linux
$strace-e ioctl-e raw=ioctl fattr/
ioctl(0x3、0x80047210、0x7fff9d8d1edc)=-1(错误号25)
/:设备的ioctl不合适
为什么在您知道它是主要的之后导入sys?@Serdalis,因为在下一行中,这个演示程序会迭代所有的程序,如果这个演示程序用作库,那么就不需要
sys
。我在考虑这个解决方案,但是您是如何获得函数地址的(FAT\u IOCTL\u GET\u ATTRIBUTES=0x80047210)?在我的发行版上,我收到错误“函数未实现”@user2260486这是一个奇怪的错误,因为ioctl编号是内核接口的一部分,因此不应该更改。在安装strace和fattr之后,您从
strace-e ioctl-e raw=ioctl fattr/
中得到了什么输出?
$uname--a
Linux deb7 3.2.0-4-amd64\1 SMP Debian 3.2.35-2 x86\u 64 GNU/Linux$strace-e ioctl-e raw=ioctl fattr/
ioctl(0x3、0x80047210、0x7fff9d8d1edc)=-1(errno 25)
/:设备的ioctl不合适