public FileExistence checkFileExists(string folder, string fileName)
{
//get file list
List<SftpFile> fileList = sftp.ListDirectory(folder).ToList();
if (fileList == null)
{
return FileExistence.UNCONFIRMED;
}
foreach (SftpFile f in fileList)
{
Console.WriteLine(f.ToString());
//a not case sensitive comparison is made
if (f.IsRegularFile && f.Name.ToLower() == fileName.ToLower())
{
return FileExistence.EXISTS;
}
}
//if not found in traversal , it does not exist
return FileExistence.DOES_NOT_EXIST;
}
其中文件存在是
public enum FileExistence
{
EXISTS,
DOES_NOT_EXIST,
UNCONFIRMED
};
6条答案
按热度按时间z3yyvxxp1#
这个库有一些怪癖,使得这个递归清单很棘手,因为
ChangeDirectory
和ListDirectory
之间的交互并不像您期望的那样工作。以下代码不列出/home目录中的文件,而是列出/(根)目录中的文件:
以下内容不起作用,并返回SftpPathNotFoundException:
以下是列出/home目录中文件的正确方法
如果你问我的话,这是相当疯狂的。用
ChangeDirectory
方法设置默认目录对ListDirectory
方法没有影响,除非你在这个方法的参数中指定一个文件夹。看起来应该为此写一个bug。所以当你写递归函数的时候,你必须设置一次默认目录,然后在
ListDirectory
调用中改变目录,当你遍历文件夹的时候。这个清单返回一个SftpFiles的枚举。然后可以单独检查IsDirectory == true
。注意这个清单也返回.
和..
条目(这些都是目录)。如果你想避免无限循环,你可以跳过这些。:-)2018年2月23日编辑
我回顾了我以前的一些回答,想为上面的回答道歉,并提供下面的工作代码。注意,这个例子不需要
ChangeDirectory
,因为它使用Fullname
代替ListDirectory
:t9eec4r02#
试试这个:
jjhzyzn03#
这是一个完整的类。它是.NET Core 2.1 Http触发器函数应用程序(v2)
我想删除所有以.“”开头的目录,因为我的sftp服务器有.cache文件夹和.ssh文件夹,它们都有密钥。我也不想处理像.“”或..“”这样的文件夹名称
我最终要做的是将SftpFile投影到我使用的类型中,并将其返回给调用方(在本例中,它将是一个逻辑应用程序)。然后,我将把该对象传递到一个存储过程中,并使用OPENJSON构建我的监控表。这基本上是创建SFTP处理队列的第一步,该队列将把文件从SFTP文件夹移动到数据湖中(blob现在,直到我想出更好的东西,我猜)。
我之所以使用.WorkingDirectory是因为我创建了一个主目录为“/home”的用户。这让我可以遍历所有用户文件夹。我的应用不需要有一个特定的文件夹作为起点,可以说用户“root”就可以了。
d6kp6zgx4#
我已经使用递归实现了这一点。创建了一个如下所示的类TransportResponse
我创建了一个TransportResponse类的列表。如果directoryName不为空,它将包含一个相同类的列表,该类将把该目录中的文件作为MemoryStream(这可以根据您的用例进行更改)
希望这个能帮上忙谢谢
1rhkuytd5#
@卡洛斯·博斯
这个库有一些怪癖,使得这个递归列表很棘手,因为ChangeDirectory和ListDirectory之间的交互并不像您期望的那样工作。
改正
当ChangeDirectory()参数为“”时,它可以正常工作。
但如果你这么做了
则存在Assert,因为ListDirectory()调用期望“some_folder/some_folder”
我使用的变通方法是在远程上传/重命名为“some_folder”之前保存并恢复当前目录,并且您需要在操作之前列出该文件夹(例如,查看文件是否已经存在)
要检查文件是否存在,此调用就足够了
或者如果您想添加一些其他条件,例如是否区分大小写
其中文件存在是
7gs2gvoe6#
扩展方法: