/// <summary> /// 获取一个文件 /// </summary> /// <param name="vdir">虚拟路径</param> /// <param name="modify">需要修改的权限</param> /// <returns>文件信息,如不存在则为null</returns> public FileInfo GetFile(string vdir, bool modify = false) { string pre = VPath.NormalizeFilename(vdir); VFile file = Get(pre) as VFile; if (file == null) { return(null); } if (modify && !file.Permission.GroupCanWrite) { return(null); } return(file.RealFile); }
/* perm权限设置 * perm="a" / "c" / "d" / "e" / "f" / "l" / "m" / "p" / "r" / "w" * a:文件,APPE追加许可 * c:文件夹,STOR STOU APPE存储许可(不能已存在) * d:全部,RMD DELE删除许可 * e:文件夹,CWD PWD CDUP目录切换许可 * f:全部,RNFR重命名许可 * l:文件夹,LIST NLST MLSD列目录许可 * m:文件夹,MKD建目录许可 * p:文件夹,DELE文件夹内容删除许可 * r:文件,RTER取得许可 * w:文件,STOR存储许可 */ /// <summary> /// 取得格式化的文件列表 /// <para>MLSD in RFC 3659</para> /// </summary> /// <param name="vPath"></param> /// <returns></returns> public List <string> MachineListFiles(string vPath = null) { VDirectory dir; if (string.IsNullOrEmpty(vPath)) { dir = _currentDirectory; SetPermission(dir, true); } else { dir = Get(VPath.NormalizeFilename(vPath), true) as VDirectory ?? _currentDirectory; } dir.Refresh(); //FIXED:目录及时更新 List <string> fileList = new List <string>(); DateTime now = DateTime.Now; foreach (var f in dir.SubFiles) { if (!f.Permission.CanRead) { continue; } //参考格式 //type=dir;modify=20141218151753;perm=el; 新建文件夹 DateTime editDate; StringBuilder sb = new StringBuilder(); if (f.IsDirectory) { VDirectory vf = (VDirectory)f; editDate = vf.RealDirectory.LastWriteTime.ToUniversalTime(); sb.Append("Type=dir;"); //type类型 sb.Append("modify=").Append(editDate.ToString("yyyyMMddHHmmss")).Append(';'); //modify修改时间 //sb.Append("size=").Append("0"); //文件夹没有size //-RFC 3659- -7.5.5- Its value is always an unordered sequence of alphabetic characters. 意味着权限字母不用排序 sb.Append("perm=el"); //perm权限,具体见上 if (vf.Permission.CanWrite) { sb.Append("cm"); } if (vf.Permission.GroupCanWrite) { sb.Append("dfp"); } sb.Append("; "); sb.Append(f.Name); } else { VFile vf = (VFile)f; editDate = vf.RealFile.LastWriteTime.ToUniversalTime(); //参考格式 //type=file;modify=20140628041312;size=761344; Server.exe sb.Append("type=file;"); //type类型 sb.Append("modify=").Append(editDate.ToString("yyyyMMddHHmmss")).Append(';'); //modify修改时间 sb.Append("size=").Append(vf.RealFile.Length).Append(';'); //size大小 //-RFC 3659- -7.5.5- Its value is always an unordered sequence of alphabetic characters. 意味着权限字母不用排序 sb.Append("perm=r"); //perm权限,具体见上 if (vf.Permission.CanWrite) { //sb.Append("cm"); } if (vf.Permission.GroupCanWrite) { sb.Append("adfw"); } sb.Append("; "); sb.Append(f.Name); } fileList.Add(sb.ToString()); } return(fileList); }
private List <string> GenerateList(IEnumerable <IFile> list) { List <string> fileList = new List <string>(); DateTime now = DateTime.Now; foreach (var f in list) { if (!f.Permission.CanRead) { continue; } //参考格式 //drwxrwxrwx 1 user group 0 Nov 27 00:13 上传 StringBuilder sb = new StringBuilder(); DateTime editDate; if (f.IsDirectory) { VDirectory vf = (VDirectory)f; editDate = vf.RealDirectory.LastWriteTime; sb.Append('d').Append(f.Permission.ToString()); //文件权限10位 sb.Append(" 1 "); //1空格 子文件个数2位 1空格 sb.Append(string.Format("{0,-8}", _config.Owner.PadRight(8))).Append(' '); //文件所有者8位 1空格 sb.Append(string.Format("{0,-8}", _config.OwnerGroup.PadRight(8))).Append(' '); //文件所有者8位 1空格 //sb.Append(_config.Owner.Substring(0, 8).PadRight(8)).Append(' '); //文件所有者8位 1空格 //sb.Append(_config.OwnerGroup.Substring(0, 8).PadRight(8)).Append(' '); //文件所有组8位 1空格 sb.Append(" 0 "); //文件大小>=8位,文件夹通常为0或4096 1空格 sb.Append(editDate < now.Subtract(TimeSpan.FromDays(180)) //文件修改日期5位,1空格,时间5位,1空格 ? editDate.ToString("MMM dd yyyy", CultureInfo.InvariantCulture) : editDate.ToString("MMM dd HH:mm", CultureInfo.InvariantCulture)) .Append(' '); sb.Append(f.Name); } else { VFile vf = (VFile)f; editDate = vf.RealFile.LastWriteTime; //string.Format("{0,-50}", theObj);//格式化成50个字符,原字符左对齐,不足则补空格 //string.Format("{0,50}", theObj);//格式化成50个字符,原字符右对齐,不足则补空格 sb.Append('-').Append(f.Permission.ToString()); //文件权限10位 sb.Append(" 1 "); //1空格 子文件个数2位 1空格 sb.Append(string.Format("{0,-8}", _config.Owner.PadRight(8))).Append(' '); //文件所有者8位 1空格 sb.Append(string.Format("{0,-8}", _config.OwnerGroup.PadRight(8))).Append(' '); //文件所有者8位 1空格 //sb.Append(_config.OwnerGroup.Substring(0, 8).PadRight(8)).Append(' '); //文件所有组8位 1空格 string length = vf.RealFile.Length.ToString(CultureInfo.InvariantCulture); if (length.Length < 8) { length = length.PadLeft(8); } sb.Append(length).Append(' '); //文件大小>=8位 1空格 sb.Append(editDate < now.Subtract(TimeSpan.FromDays(180)) //文件修改日期5位,1空格,时间5位,1空格 ? editDate.ToString("MMM dd yyyy", CultureInfo.InvariantCulture) : editDate.ToString("MMM dd HH:mm", CultureInfo.InvariantCulture)) .Append(' '); sb.Append(f.Name); } fileList.Add(sb.ToString()); } return(fileList); }
/// <summary> /// 取得格式化的文件信息 /// <para>MLST in RFC 3659</para> /// </summary> /// <param name="vPath"></param> /// <returns></returns> public string MachineFileInfo(string vPath = null) { IFile f; bool isDir = false; StringBuilder sb = new StringBuilder(); DateTime editDate; if (string.IsNullOrEmpty(vPath)) { f = _currentDirectory; isDir = true; } else { if (ExistsFile(vPath)) { f = Get(vPath) as VFile; isDir = false; } else if (ExistsDirectory(vPath)) { f = Get(vPath, true) as VDirectory; isDir = true; } else { return(""); } } if (f == null) { return(""); } if (isDir) { var vf = (VDirectory)f; editDate = vf.RealDirectory.LastWriteTime.ToUniversalTime(); //FIXED:需要使用UTC时间 sb.Append("type=dir;"); //type类型 sb.Append("modify=").Append(editDate.ToString("yyyyMMddHHmmss")).Append(';'); //modify修改时间 sb.Append("perm=el"); //perm权限 if (vf.Permission.CanWrite) { sb.Append("cm"); } if (vf.Permission.GroupCanWrite) { sb.Append("dfp"); } sb.Append("; "); if (vf == _rootDirectory) { sb.Append("/"); } else { sb.Append(f.Name); } } else { VFile vf = (VFile)f; editDate = vf.RealFile.LastWriteTime.ToUniversalTime(); //FIXED:需要使用UTC时间 //参考格式 //type=file;modify=20140628041312;size=761344; Server.exe sb.Append("type=file;"); //type类型 sb.Append("modify=").Append(editDate.ToString("yyyyMMddHHmmss")).Append(';'); //modify修改时间 sb.Append("size=").Append(vf.RealFile.Length).Append(';'); //size大小 sb.Append("perm=r"); //perm权限 if (vf.Permission.CanWrite) { //sb.Append("cm"); } if (vf.Permission.GroupCanWrite) { sb.Append("adfw"); } sb.Append("; "); sb.Append(f.Name); } return(sb.ToString()); }