繁体   English   中英

如何使用C#和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();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM