2013-05-07 271 views
2

我试图遍历目录的内容并确定每个项目是否是文件或文件夹。我可以做this link建议的解决方案:区分paramiko中的文件或目录

>>> for i in ftp.listdir(): 
...  lstatout=str(ftp.lstat(i)).split()[0] 
...  if 'd' not in lstatout: print i, 'is a file' 
... 

这工作,是的。作为旁注,我只是取第一个字符而不是.split(),所以str(ftp.lstati(i))[0] != 'd',因为在我公认的非科学测试中,这似乎更快。

但是,这看起来非常黑客,所以我试图检查其他方法。在SFTP几个文件夹的属性,我看到:

<SFTPAttributes: [ size=4096 uid=1002 gid=1002 mode=040755 atime=1358785383 mtime=1359475285 ]> 

而在同一的文件,我看到:

<SFTPAttributes: [ size=72 uid=1002 gid=1002 mode=0100644 atime=1367598914 mtime=1367598914 ]> 

如此看来,该模式是010[permissions]的文件,并040[permissions]为目录(在我见过的几个目录中一致,但不能说它是通用的)。这似乎是获得物品属性的更好方法!但是,当我使用ftp.stat(i).st_mode时,对于上述目录,我得到不同的值 - 16877,对于上述文件我得到不同的值33188

这些是什么意思?有没有办法可以将该整数转换为文件模式? (我试过谷歌,但找不到任何相关的东西。)另外,有没有什么好的方法可以确定这一点,而不依赖于str(lstat(i))函数返回'd'还是不''?

+1

模式是八进制。你可以做'oct(integerValue)'来查看模式。 – sberry 2013-05-07 06:29:19

回答

2

看起来高位确实告诉你它是否是一个文件或目录:

S_ISDIR
S_ISREG

>>> oct(16877) 
'040755' 
>>> oct(33188) 
'0100644' 

而且同样:

>>> int('040755', 8) 
16877 
>>> int('0100644', 8) 
33188 
1

的paramiko的SFTPAttributes.st_mode可以传递给Python的os.stat进行分析:

for file in ftp_cli.listdir_attr(path): 
    is_dir = stat.S_ISDIR(file.st_mode) 
    is_link = stat.S_ISLNK(file.st_mode) 
    is_file = stat.S_ISREG(file.st_mode) 
+1

同一事物的另一个变体: 'import stat' 'is_dir = stat.S_ISDIR(ftp.stat(remotepath).st_mode)' – cowlinator 2017-11-14 00:33:28

相关问题