我正在尝试使用 SFTP 连接从远程目录中获取文件计数,但我得到了.
并且..
这些点像文件一样被计算在内,我在远程目录中有 2 个文件,但正在计算 4 个文件,包括.
和..
.
有人可以帮我解决这个问题吗?
这是我的代码:
filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;
谢谢!
我正在尝试使用 SFTP 连接从远程目录中获取文件计数,但我得到了.
并且..
这些点像文件一样被计算在内,我在远程目录中有 2 个文件,但正在计算 4 个文件,包括.
和..
.
有人可以帮我解决这个问题吗?
这是我的代码:
filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;
谢谢!
根据WinSCP 文档:
Session.EnumerateRemoteFiles
如果你想,你可以使用方法来代替:
- 仅列出与通配符匹配的文件;
- 递归列出文件;
- 从列表中排除对此 (.) 和父 (..) 目录的引用。
所以看起来你应该改变你的代码来做更多这样的事情:
filesCount = 0;
filesCount = session.EnumerateRemoteFiles(DataFile.sRemoteDirectory).Files.Count();
session.Close();
ListDirectory
您可以使用而不是使用EnumerateRemoteFiles
,它不会包括“..”和“。”
“。” 和“..”分别表示这个目录和父目录。
在大多数文件系统上,.
和..
分别是对此目录和父目录的引用。
要过滤它们,您可以使用新属性.IsThisDirectory
和.IsParentDirectory
类:RemoteFileInfo
filesCount =
session.ListDirectory(DataFile.sRemoteDirectory).Files
.Where(file => !file.IsThisDirectory && !file.IsParentDirectory).Count();
请注意,您必须使用Enumerable.Count()
扩展方法,而不是ICollection.Count
属性,因为Enumerable.Where()
is the IEnumerable
,而不是 the Collection
。
或者为了更容易,使用Session.EnumerateRemoteFiles()
方法,它与EnumerationOptions.None
选项在功能上等同于Session.ListDirectory()
,只是它排除了.
and ..
。
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
没有名称比较的案例。