Python: SFTP: перечислить каталоги и файлы рекурсивно на основе шаблона регулярного выражения [duplicate]

Вы можете создать следующий класс:

  с помощью System;  используя System.Collections.Generic;  используя System.Linq;  используя System.Text;  используя System.Runtime.Serialization.Formatters.Soap;  используя System.Reflection;  используя System.IO;  namespace SerializeStatic_NET {public class SerializeStatic {public static bool Сохранить (Тип static_class, имя_файла) {try {FieldInfo [] fields = static_class.GetFields (BindingFlags.Static | BindingFlags.Public);  object [,] a = новый объект [fields.Length, 2];  int i = 0;  foreach (поле FieldInfo в полях) {a [i, 0] = field.Name;  a [i, 1] = field.GetValue (null);  я ++;  };  Поток f = File.Open (имя файла, FileMode.Create);  SoapFormatter formatter = new SoapFormatter ();  formatter.Serialize (f, a);  f.close ();  return true;  } catch {return false;  }} public static bool Load (Тип static_class, string filename) {try {FieldInfo [] fields = static_class.GetFields (BindingFlags.Static | BindingFlags.Public);  object [,] a;  Поток f = File.Open (имя файла, FileMode.Open);  SoapFormatter formatter = new SoapFormatter ();  a = formatter.Deserialize (f) как объект [,];  f.close ();  if (a.GetLength (0)! = fields.Length) return false;  int i = 0;  foreach (поле FieldInfo в полях) {if (field.Name == (a [i, 0] как строка)) {field.SetValue (null, a [i, 1]);  } i ++;  };  return true;  } catch {return false;  }}}}  

Вы должны определить ссылку на System.Runtime.Serialization.Formatters.Soap.

Скажите, что в вашей программе вы хотите сохранить следующие статические class:

  public static class A {public static string s;  public static int i;  public static double z;  }  

Вы можете использовать следующий код:

  bool ok = SerializeStatic.Save (typeof (A), "c: \\ tests \\ a  .dat ");   

Если вы хотите загрузить сохраненные данные (в той же программе или в другую программу), используйте следующий код:

  bool ok2 = SerializeStatic.  Load (typeof (A), "c: \\ tests \\ a.dat");   

Поля A.s, A.i, A.z получат новые загруженные значения.

9
задан Arahman 13 July 2011 в 07:23
поделиться

5 ответов

  from stat import S_ISDIR def isdir (path): try: return S_ISDIR (sftp.stat (путь) .st_mode), за исключением IOError: #Path не существует, поэтому по определению не возвращается каталог False  

... предполагая, что sftp - это открытое SFTP-соединение Paramiko.

11
ответ дан westmark 16 August 2018 в 05:33
поделиться

Старый вопрос, но решение, которое я придумал, работает довольно хорошо, это немного небрежно (typecasting и slashes и все), но он работает.

Обратите внимание, что это использует fabric.api.local , чтобы сделать каталоги в месте назначения.

  def sftp_get_recursive (путь, dest, sftp = sftp): item_list = sftp.listdir (path) dest = str  (dest), если не os.path.isdir (dest): local ("mkdir% s"% dest) для item в item_list: item = str (item) if is_directory (путь + "/" + item, sftp): sftp_get_recursive  (path + "/" + item, dest + "/" + item, sftp) else: sftp.get (путь + "/" + item, dest + "/" + item)  
2
ответ дан Dan LaManna 16 August 2018 в 05:33
поделиться

Вы можете использовать метод stat () вашего объекта sftp:

http://www.lag.net/paramiko/docs/paramiko.SFTPClient-class.html

1
ответ дан guettli 16 August 2018 в 05:33
поделиться
  • 1
    Ах, да, это возможно. Еще не протестировали его, но, с некоторой удачей, флаг каталога может быть проанализирован из SFTPAttributes.st_mode. Теперь мне просто нужно изучить, какие флаги скрыты в этом значении режима ... – Arahman 13 July 2011 в 13:51

Метод stat () среди других атрибутов возвращает разрешения. d (например, drwxrwxrwx) показывает, что это каталог.

В качестве примера:

  dir = oct (sftp.stat (path) .st_mode) print dir [0:  2]  

выход interpritation: 01 fifo 02 характер специальный 04 каталог 06 блок специальный 10 обычный файл 12 символическая ссылка 14 гнездо

2
ответ дан user1268328 16 August 2018 в 05:33
поделиться

Если вы используете Linux или Unix-подобные. U может использовать служебную программу «file» с именем popen. Или просто u может использовать os.path.isdir () =)

-5
ответ дан Denis 16 August 2018 в 05:33
поделиться
  • 1
    Правильный английский, пожалуйста. Кроме того, использование файла для проверки того, что что-то является папкой или нет, довольно грязно. И используя os.path.isdir () в удаленном файле ..? – ThiefMaster♦ 13 July 2011 в 13:10
Другие вопросы по тегам:

Похожие вопросы: