2013-05-07 2 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 для вышеупомянутого файла.

Что это значит? Есть ли способ, которым я могу преобразовать это целое число в режим файла? (Я пробовал Google, но не могу найти что-либо релевантное.) Альтернативно, есть ли какой-либо хороший способ, я могу определить это, не полагаясь на функцию str(lstat(i)), возвращающую 'd' или нет-бы?

+1

Режимы являются восьмеричными. Вы можете сделать 'oct (integerValue)' для просмотра режима. – sberry

ответ

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

Смежные вопросы