![](/img/trans.png)
[英]How to get the files of remote directory using a pattern with C# and WinSCP
[英]How to remove “.” and “..” files from remote directory with C# and WinSCP
我正在尝试使用SFTP连接从远程目录中获取文件数,但我得到了.
和..
这些点数像文件一样,我在远程目录中有2个文件,但是计算4个文件,包括.
和..
有人可以帮我解决这个问题吗?
这是我的代码:
filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;
谢谢!
根据WinSCP文档 :
您可以使用
Session.EnumerateRemoteFiles
方法,如果您想:
- 仅列出与通配符匹配的文件;
- 递归列出文件;
- 从列表中排除对此(。)和父(...)目录的引用。
因此,您似乎应该更改代码以执行更多类似的操作:
filesCount = 0;
filesCount = session.EnumerateRemoteFiles(DataFile.sRemoteDirectory).Files.Count();
session.Close();
您可以使用EnumerateRemoteFiles
而不是使用ListDirectory
,它不会包含“..”和“。”。
“” 和“..”分别表示该目录和父目录。
的.
和..
分别是在大多数文件系统上对this和parent目录的引用。
要过滤它们,可以使用RemoteFileInfo
类的新属性.IsThisDirectory
和.IsParentDirectory
:
filesCount =
session.ListDirectory(DataFile.sRemoteDirectory).Files
.Where(file => !file.IsThisDirectory && !file.IsParentDirectory).Count();
请注意,您必须使用Enumerable.Count()
扩展方法 ,而不是ICollection.Count
属性,因为Enumerable.Where()
的结果是IEnumerable
,而不是Collection
。
或者为了使它更容易,使用Session.EnumerateRemoteFiles()
方法 ,它与EnumerationOptions.None
选项在功能上等同于Session.ListDirectory()
,只是它排除了.
和..
filesCount =
session.EnumerateRemoteFiles(
DataFile.sRemoteDirectory, null, EnumerationOptions.None).Count();
如果要筛选所有目录,请使用:
filesCount =
session.ListDirectory(DataFile.sRemoteDirectory).Files
.Where(file => !file.IsDirectory).Count();
请尝试session.EnumerateRemoteFiles。
尽管命名,但Files
集合不仅包含文件,还包含所有目录条目,包括当前和父目录引用。
如果您只想计算文件,请按IsDirectory
属性过滤它们:
var filesCount = session.ListDirectory(dir).Files.Where(x => !x.IsDirectory).Count();
在最新版本中还有IsParentDirectory
和IsThisDirectory
属性来过滤“..”和“。”。 无名称比较的案例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.