如何删除“。”和“..”来自远程目录的 C# 和 WinSCP 文件
How to remove "." and ".." files from remote directory with C# and WinSCP
我正在尝试使用 SFTP 连接从远程目录获取文件数,但我得到了 .
和 ..
,这些点像文件一样被计算,我在远程目录中有 2 个文件,但正在计算 4 个文件,包括 .
和 ..
.
谁能帮我解决这个问题?
这是我的代码:
filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;
谢谢!
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();
最新版本中还有 IsParentDirectory
和 IsThisDirectory
属性来过滤“..”和“.”。没有名称比较的案例。
在大多数文件系统上,.
和 ..
分别是对此目录和父目录的引用。
要过滤它们,您可以使用 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();
我正在尝试使用 SFTP 连接从远程目录获取文件数,但我得到了 .
和 ..
,这些点像文件一样被计算,我在远程目录中有 2 个文件,但正在计算 4 个文件,包括 .
和 ..
.
谁能帮我解决这个问题?
这是我的代码:
filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;
谢谢!
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();
最新版本中还有 IsParentDirectory
和 IsThisDirectory
属性来过滤“..”和“.”。没有名称比较的案例。
在大多数文件系统上,.
和 ..
分别是对此目录和父目录的引用。
要过滤它们,您可以使用 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();