我尝试使用SFTP连接从远程目录中获取文件数,但我得到.
和..
这些点数就像文件一样计算,我在远程目录中有2个文件,但计算包括.
和..
在内的4个文件。
有人可以帮我解决这个问题吗?
这是我的代码:
filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;
谢谢!
答案 0 :(得分:5)
如果您愿意,可以使用
Session.EnumerateRemoteFiles
方法:
- 仅列出与通配符匹配的文件;
- 递归列出文件;
- 从列表中排除对此(。)和父(...)目录的引用。
因此,您似乎应该更改代码以执行更类似的操作:
filesCount = 0;
filesCount = session.EnumerateRemoteFiles(DataFile.sRemoteDirectory).Files.Count();
session.Close();
答案 1 :(得分:3)
您可以使用ListDirectory
而不是EnumerateRemoteFiles
,而不会包含“..”和“。”
“”。和“..”分别表示此目录和父目录。
答案 2 :(得分:2)
.
和..
分别是大多数文件系统上对此目录和父目录的引用。
要过滤它们,您可以使用RemoteFileInfo
class的新属性.IsThisDirectory
和.IsParentDirectory
:
filesCount =
session.ListDirectory(DataFile.sRemoteDirectory).Files
.Where(file => !file.IsThisDirectory && !file.IsParentDirectory).Count();
请注意,您必须使用Enumerable.Count()
extension method而不是ICollection.Count
property,因为Enumerable.Where()
是IEnumerable
,而不是Collection
或者为了更加轻松,请使用Session.EnumerateRemoteFiles()
method Session.ListDirectory()
,EnumerationOptions.None
选项在功能上等同于{{3}},只是排除了.
和{ {1}}。
..
如果要过滤所有目录,请使用:
filesCount =
session.EnumerateRemoteFiles(
DataFile.sRemoteDirectory, null, EnumerationOptions.None).Count();
答案 3 :(得分:0)
尝试使用session.EnumerateRemoteFiles。
答案 4 :(得分:0)
尽管有命名,Files
集合不仅包含文件,还包含所有目录条目,包括当前和父目录引用。
如果您只想计算文件,请按IsDirectory
属性过滤它们:
var filesCount = session.ListDirectory(dir).Files.Where(x => !x.IsDirectory).Count();
最新版本中还有IsParentDirectory
和IsThisDirectory
属性可以过滤" .."和"。"没有名称比较的案例。