C#如何获取FTP服务器上的某个文件夹大小和最后修改时间
我想通过c#取出ftp服务器上的文件夹大小,和他的最后修改时间,哪位能帮个忙?谢谢啊! --------------------编程问答-------------------- 加分。急等啊! --------------------编程问答-------------------- 学习 帮顶 接分 --------------------编程问答-------------------- 是ftp还是自己的服务器?如果是他人的服务器应该不允许你获取这些信息的。
如果是自己的好像可以考虑用file类的某些方法去访问。具体的查找一下msdn吧。 --------------------编程问答-------------------- ftp的List命令吧 --------------------编程问答-------------------- 是FTP服务器,我要取的是一个文件夹的大小。 --------------------编程问答-------------------- 个人觉得你需要做的类似监控程序,需要得到服务器上的文件信息,
如果你已经可以取到文件的信息了,就可以得到你要的,
FileInfo fi =new FileInfo(path)
//path 你的文件路径
int len=fi.Length; //得到文件大
//定义最后修改时间
Datetime FileModfiy
//取得最后时间
FileModfiy=fi.LastWriteTime //文件的最后修改时间
--------------------编程问答-------------------- 楼上的这个好像是取本机上的文件信息吧,我要取的是FTP服务器上的文件夹信息啊。 --------------------编程问答-------------------- 我试过用dos里的ftp命令,但是windows操作系统里dos的ftp命令好像没有modtime和size之类的命令。
还有我试过在.net2.0里用下面代码取过最后修改时间,但是取出来的时间不对。
reqFTP = (System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(new Uri("ftp://" + pServerURI + "/" + pDirectory + "/" + pFileName));
reqFTP.Method = System.Net.WebRequestMethods.Ftp.GetDateTimestamp;
reqFTP.UseBinary = true;
reqFTP.Credentials = new System.Net.NetworkCredential(pUserID, pPassword);
System.Net.FtpWebResponse response = (System.Net.FtpWebResponse)reqFTP.GetResponse();
System.IO.Stream ftpStream = response.GetResponseStream();
fileTime = response.LastModified.ToString();
ftpStream.Close();
response.Close();
return fileTime; --------------------编程问答-------------------- 在你的FTP类里要声明下文件信息
#region 文件信息结构
public struct FileStruct
{
public string Flags;
public string Owner;
public string Group;
public bool IsDirectory;
public DateTime CreateTime;
public string Name;
}
public enum FileListStyle
{
UnixStyle,
WindowsStyle,
Unknown
}
#endregion
然后获取写一些方法
#region 列出目录文件信息
/// <summary>
/// 列出FTP服务器上面当前目录的所有文件和目录
/// </summary>
public FileStruct[] ListFilesAndDirectories()
{
Response = Open(this.Uri, WebRequestMethods.Ftp.ListDirectoryDetails);
StreamReader stream = new StreamReader(Response.GetResponseStream(), Encoding.Default);
string Datastring = stream.ReadToEnd();
FileStruct[] list = GetList(Datastring);
return list;
}
/// <summary>
/// 列出FTP服务器上面当前目录的所有文件
/// </summary>
public FileStruct[] ListFiles()
{
FileStruct[] listAll = ListFilesAndDirectories();
List<FileStruct> listFile = new List<FileStruct>();
foreach (FileStruct file in listAll)
{
if (!file.IsDirectory)
{
listFile.Add(file);
}
}
return listFile.ToArray();
}
/// <summary>
/// 列出FTP服务器上面当前目录的所有的目录
/// </summary>
public FileStruct[] ListDirectories()
{
FileStruct[] listAll = ListFilesAndDirectories();
List<FileStruct> listDirectory = new List<FileStruct>();
foreach (FileStruct file in listAll)
{
if (file.IsDirectory)
{
listDirectory.Add(file);
}
}
return listDirectory.ToArray();
}
/// <summary>
/// 获得文件和目录列表
/// </summary>
/// <param name="datastring">FTP返回的列表字符信息</param>
private FileStruct[] GetList(string datastring)
{
List<FileStruct> myListArray = new List<FileStruct>();
string[] dataRecords = datastring.Split('\n');
FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
foreach (string s in dataRecords)
{
if (_directoryListStyle != FileListStyle.Unknown && s != "")
{
FileStruct f = new FileStruct();
f.Name = "..";
switch (_directoryListStyle)
{
case FileListStyle.UnixStyle:
f = ParseFileStructFromUnixStyleRecord(s);
break;
case FileListStyle.WindowsStyle:
f = ParseFileStructFromWindowsStyleRecord(s);
break;
}
if (!(f.Name == "." || f.Name == ".."))
{
myListArray.Add(f);
}
}
}
return myListArray.ToArray();
}
/// <summary>
/// 从Windows格式中返回文件信息
/// </summary>
/// <param name="Record">文件信息</param>
private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
{
FileStruct f = new FileStruct();
string processstr = Record.Trim();
string dateStr = processstr.Substring(0, 8);
processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
string timeStr = processstr.Substring(0, 7);
processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
myDTFI.ShortTimePattern = "t";
f.CreateTime = DateTime.Parse(dateStr + " " + timeStr, myDTFI);
if (processstr.Substring(0, 5) == "<DIR>")
{
f.IsDirectory = true;
processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
}
else
{
string[] strs = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // true);
processstr = strs[1];
f.IsDirectory = false;
}
f.Name = processstr;
return f;
}
/// <summary>
/// 判断文件列表的方式Window方式还是Unix方式
/// </summary>
/// <param name="recordList">文件信息列表</param>
private FileListStyle GuessFileListStyle(string[] recordList)
{
foreach (string s in recordList)
{
if (s.Length > 10
&& Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
{
return FileListStyle.UnixStyle;
}
else if (s.Length > 8
&& Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
{
return FileListStyle.WindowsStyle;
}
}
return FileListStyle.Unknown;
}
/// <summary>
/// 从Unix格式中返回文件信息
/// </summary>
/// <param name="Record">文件信息</param>
private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
{
FileStruct f = new FileStruct();
string processstr = Record.Trim();
f.Flags = processstr.Substring(0, 10);
f.IsDirectory = (f.Flags[0] == 'd');
processstr = (processstr.Substring(11)).Trim();
_cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳过一部分
f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
f.Group = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
_cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳过一部分
string yearOrTime = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2];
if (yearOrTime.IndexOf(":") >= 0) //time
{
processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());
}
f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr, ' ', 8));
f.Name = processstr; //最后就是名称
return f;
}
/// <summary>
/// 按照一定的规则进行字符串截取
/// </summary>
/// <param name="s">截取的字符串</param>
/// <param name="c">查找的字符</param>
/// <param name="startIndex">查找的位置</param>
private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
{
int pos1 = s.IndexOf(c, startIndex);
string retString = s.Substring(0, pos1);
s = (s.Substring(pos1)).Trim();
return retString;
}
#endregion
然后根据你的要求,来获取吧
在你的调用程序里
FileStruct[] fs = objFtp.ListFiles();
fs[i].CreateTime 是时间,至于大小,我这里没有,你可以自己加上 --------------------编程问答-------------------- FTP远程主机强制关闭了一个现有的连接,报错! --------------------编程问答-------------------- 首先要有權限 --------------------编程问答-------------------- 在线等! --------------------编程问答-------------------- ftp协议是公开的……远程主机强制关闭了一个现有的连接这样的网络问题你应该捕获到并且重试 --------------------编程问答-------------------- 今天也碰到了这样的问题
但是不是获得ftp文件的修改时间,是判断文件是否是隐藏
lslsls的方法似乎获得是文件和文件列表,
查找了一些ftp常用的命令,但是也没有发现
lz的问题如果解决了麻烦给说一下方法 --------------------编程问答-------------------- 文件夹的大小应该要通过枚举文件夹内的所有文件累加得到吧。
--------------------编程问答-------------------- FtpWebResponse.LastModified
FtpWebRequest.Method设置一下。包括WebRequestMethods.Ftp 这个里具体里的东西AppendFile ,DeleteFile ,DownloadFile ,GetDateTimestamp ,GetFileSize ,ListDirectory ,ListDirectoryDetails ,MakeDirectory ,PrintWorkingDirectory ,RemoveDirectory ,Rename ,UploadFile ,UploadFileWithUniqueName
这几个够你用的了吧?完全就符合你的要去了。 --------------------编程问答-------------------- FILESTRUCT对象是什么啊?自定义的吗? --------------------编程问答-------------------- 用request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;这个方法就可以取到老,很简单
补充:.NET技术 , C#