4

ディレクトリの内容を調べて、各項目がファイルかフォルダーかを判断しようとしています。このリンクで提案されている解決策を実行できます:

>>> 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異なる値が得られます。1687733188

これらはどういう意味ですか?その整数をファイルモードに変換する方法はありますか? str(lstat(i))(Google を試しましたが、関連するものが見つかりません。) または、 「d」または「d」以外を返す関数に依存せずにこれを判断できる良い方法はありますか?

4

2 に答える 2

4

上位ビットは、ファイルかディレクトリかを実際に示しているようです。

S_ISDIR
S_ISREG

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

同様に:

>>> int('040755', 8)
16877
>>> int('0100644', 8)
33188
于 2013-05-07T06:31:47.543 に答える