如何删除“。”和“..”来自远程目录的 C# 和 WinSCP 文件

How to remove "." and ".." files from remote directory with C# and WinSCP

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

谁能帮我解决这个问题?

这是我的代码:

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

谢谢!

根据the WinSCP documentation

You can use Session.EnumerateRemoteFiles method instead, if you want to:

  • List only files matching a wildcard;
  • List the files recursively;
  • Have references to this (.) and parent (..) directories be excluded form the listing.

看来您应该更改您的代码以执行更类似的操作:

filesCount = 0; 
filesCount = session.EnumerateRemoteFiles(DataFile.sRemoteDirectory).Files.Count();                
session.Close();

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

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

试试 session.EnumerateRemoteFiles。

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

如果您只想计算文件数量,请按 IsDirectory 属性:

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

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

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


要过滤它们,您可以使用 RemoteFileInfo class:

的新属性 .IsThisDirectory.IsParentDirectory
filesCount =   
    session.ListDirectory(DataFile.sRemoteDirectory).Files
        .Where(file => !file.IsThisDirectory && !file.IsParentDirectory).Count();

请注意,您必须使用 Enumerable.Count() extension method, instead of the ICollection.Count property,因为 Enumerable.Where() 的结果是 IEnumerable,不再是 Collection


或者为了更简单,使用 Session.EnumerateRemoteFiles() method, which with the EnumerationOptions.None option is functionally equivalent to the Session.ListDirectory(),只是它排除了 ...

filesCount =
    session.EnumerateRemoteFiles(
        DataFile.sRemoteDirectory, null, EnumerationOptions.None).Count();

如果要过滤所有目录,请使用:

filesCount =   
    session.ListDirectory(DataFile.sRemoteDirectory).Files
        .Where(file => !file.IsDirectory).Count();