3

我正在尝试使用 SFTP 连接从远程目录中获取文件计数,但我得到了.并且..这些点像文件一样被计算在内,我在远程目录中有 2 个文件,但正在计算 4 个文件,包括....

有人可以帮我解决这个问题吗?

这是我的代码:

filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;                

谢谢!

4

5 回答 5

5

根据WinSCP 文档

Session.EnumerateRemoteFiles如果你想,你可以使用方法来代替:

  • 仅列出与通配符匹配的文件;
  • 递归列出文件;
  • 从列表中排除对此 (.) 和父 (..) 目录的引用。

所以看起来你应该改变你的代码来做更多这样的事情:

filesCount = 0; 
filesCount = session.EnumerateRemoteFiles(DataFile.sRemoteDirectory).Files.Count();                
session.Close();
于 2015-12-29T20:41:21.177 回答
3

ListDirectory您可以使用而不是使用EnumerateRemoteFiles,它不会包括“..”和“。”

“。” 和“..”分别表示这个目录和父目录。

于 2015-12-29T20:41:49.887 回答
2

在大多数文件系统上,...分别是对此目录和父目录的引用。


要过滤它们,您可以使用新属性.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();               
于 2015-12-30T16:58:25.493 回答
0

尝试 session.EnumerateRemoteFiles 代替。

于 2015-12-29T20:42:25.213 回答
0

尽管命名,Files集合不仅包含文件,还包含所有目录条目,包括当前和父目录引用。

如果您只想计算文件,请按IsDirectory属性过滤它们:

var filesCount = session.ListDirectory(dir).Files.Where(x => !x.IsDirectory).Count();

最新版本中还有过滤“..”和“.”的属性IsParentDirectoryIsThisDirectory没有名称比较的案例。

于 2015-12-29T20:49:19.047 回答