Вы можете создать следующий класс:
с помощью 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 получат новые загруженные значения.
from stat import S_ISDIR def isdir (path): try: return S_ISDIR (sftp.stat (путь) .st_mode), за исключением IOError: #Path не существует, поэтому по определению не возвращается каталог False
... предполагая, что sftp
- это открытое SFTP-соединение Paramiko.
Старый вопрос, но решение, которое я придумал, работает довольно хорошо, это немного небрежно (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)
Вы можете использовать метод stat () вашего объекта sftp:
http://www.lag.net/paramiko/docs/paramiko.SFTPClient-class.html
Метод stat () среди других атрибутов возвращает разрешения. d (например, drwxrwxrwx) показывает, что это каталог.
В качестве примера:
dir = oct (sftp.stat (path) .st_mode) print dir [0: 2]
выход interpritation: 01 fifo 02 характер специальный 04 каталог 06 блок специальный 10 обычный файл 12 символическая ссылка 14 гнездо
Если вы используете Linux или Unix-подобные. U может использовать служебную программу «file» с именем popen. Или просто u может использовать os.path.isdir () =)
для проверки того, что что-то является папкой или нет, довольно грязно. И используя os.path.isdir ()
в удаленном файле ..?
– ThiefMaster♦
13 July 2011 в 13:10