Как разобрать это? ftpWebRequest ListDirectorDetials
Я играю с FtpWebRequest и мне интересно, как я могу отформатировать результат?
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create("");
ftp.Credentials = new NetworkCredential("", "");
ftp.KeepAlive = true;
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = ftp.GetResponse();
StreamReader reader = new StreamReader(response
.GetResponseStream());
string r = reader.ReadLine();
response.Close();
reader.Close();
Я получаю результаты, как это обратно
09-17-11 01:00AM 942038 my.zip
Что было бы хорошим способом разобрать это, как объект, сказать что-то вроде
public Class Test()
{
public DateTime DateCreated? {get; set;}
public int/long Size {get; set;}
public string Name {get; set;}
}
Не уверен, должен ли я использовать long или int для размера. Я также не уверен, что на самом деле дата и время, если оно создано, или изменены, или что-то еще.
3 ответа
var value = "09-17-11 01:00AM 942038 my.zip";
var tokens = value.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (tokens.Length > 3)
{
var test = new Test
{
DateCreated = DateTime.ParseExact(tokens[0] + tokens[1], "MM-dd-yyHH:mmtt", CultureInfo.InvariantCulture),
Size = int.Parse(tokens[2]),
Name = tokens[3]
};
// at this stage:
// test.DateCreated = 17/09/2011 01:00AM
// test.Size = 942038
// test.Name = "my.zip"
}
В стандарте FTP раздражает то, что он не определяет, как именно должен быть отформатирован список каталогов. В общем, списки, возвращаемые с машин *nix, больше похожи на списки каталогов *nix, а списки, возвращаемые из Windows, часто очень похожи на списки DOS, но у вас есть старый FTP-код, составляющий основу более новых продуктов, поэтому есть IBM-4690 и AS400 вещи, VMS, Oracle, Novell и так далее.
Так что, если вы пытаетесь сделать что-то общее, а не для конкретного сервера, то вам предстоит выполнить много отвратительного анализа. Это может стоить вашего времени, чтобы купить что-то, но у меня нет никаких рекомендаций.
Это мой алгоритм разбора ListDirectoryDetails. Я разделил имя файла / каталога, атрибут, дату создания и размер в список. Надеюсь это поможет....
FtpWebRequest _fwr = FtpWebRequest.Create(uri) as FtpWebRequest;
_fwr.Credentials = cred;
_fwr.UseBinary = true;
_fwr.UsePassive = true;
_fwr.KeepAlive = true;
_fwr.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
StreamReader _sr = new StreamReader(_fwr.GetResponse().GetResponseStream());
List<object> _dirlist = new List<object>();
List<object> _attlist = new List<object>();
List<object> _datelist = new List<object>();
List<long> _szlist = new List<long>();
while (!_sr.EndOfStream)
{
string[] buf = _sr.ReadLine().Split(' ');
//string Att, Dir;
int numcnt = 0, offset = 4; ;
long sz = 0;
for (int i = 0; i < buf.Length; i++)
{
//Count the number value markers, first before the ftp markers and second
//the file size.
if (long.TryParse(buf[i], out sz)) numcnt++;
if (numcnt == 2)
{
//Get the attribute
string cbuf = "", dbuf = "", abuf = "";
if (buf[0][0] == 'd') abuf = "Dir"; else abuf = "File";
//Get the Date
if (!buf[i+3].Contains(':')) offset++;
for (int j = i + 1; j < i + offset; j++)
{
dbuf += buf[j];
if (j < buf.Length - 1) dbuf += " ";
}
//Get the File/Dir name
for (int j = i + offset; j < buf.Length; j++)
{
cbuf += buf[j];
if (j < buf.Length - 1) cbuf += " ";
}
//Store to a list.
_dirlist.Add(cbuf);
_attlist.Add(abuf);
_datelist.Add(dbuf);
_szlist.Add(sz);
offset = 0;
break;
}
}
}