使用 WinSCP 和 C# 匹配不区分大小写的文件夹名称
Case insensitive folder name matching using WinSCP and C#
我正在开发一个项目,在该项目中我使用 WinSCP .NET 组件访问 SFTP 主机。代码的功能是导航到 SFTP 中的文件夹并检查提供的文件名是否位于该文件夹内。
我有以下代码,一切正常。下面的代码检查文件夹是否存在于 SFTP 远程路径中。如果它在那里,我将遍历 sFTP 目录中的所有文件以检查它是否具有我提供的文件名。
string FolderName = row["Folder_Name"].ToString();
string FileName = row["File_Name"].ToString();
FileName = FileName.Replace("\r\n", string.Empty);
string remotePath = HomeDirectory + FolderName + "/";
if(session.FileExists(remotePath))
{
RemoteDirectoryInfo directory = session.ListDirectory(remotePath);
sFTPFiles.AddRange(directory.Files
.Where(fileInfo => !fileInfo.IsDirectory)
.Select(fileInfo => fileInfo.Name.ToString()));
if(CheckFileExists(FileName, sFTPFiles) != FileExistence.EXISTS)
{
isDiscrepancy = true;
} else
{
row["sftp_available"] = true;
row["discrepancy_on_sftp"] = false;
}
}
我面临的问题是文件夹名称区分大小写的问题。在我的数据库中,文件夹名称以大写形式存储。但在 SFTP 中,相同的文件夹名称具有不同的区分大小写的名称,即。大写或句子大小写或小写。类似于 folderNAME
、FOLDERNAME
、foldername
、fOLDERNAME
执行if(session.FileExists(remotepath)
时,由于区分大小写的问题而失败。当我正在验证的文件夹名称是 FOLDERNAME
并且 SFTP 中的相同名称被写为 FOLDERname
时,由于区分大小写,它被跳过。
因此谁能告诉我如何使用 WinSCP 和 C# 以不区分大小写的方法检查文件夹名称。我所需要的只是如果我的数据库中的 Foldername
是 FOLDERNAME
,我想在 SFTP 中导航到该文件夹,即使它是上述任何一种格式。
在此先感谢您的帮助。
SFTP 文件检查 API 遵循远程系统的约定。因此,如果远程系统区分大小写,则检查将区分大小写。你对此无能为力。
您所能做的就是检索完整的远程目录列表并自行进行不区分大小写的搜索。
要快速且不区分大小写地替换 Session.FileExists
,请使用:
if (session.ListDirectory(HomeDirectory).Files.Any(
file => file.Name.Equals(FolderName, StringComparison.OrdinalIgnoreCase)))
{
// ...
}
虽然很明显,如果您要在同一个文件夹中检查很多 files/subfolders,这将是无效的。在这种情况下,您最好缓存列表并重新使用它。
RemoteDirectoryInfo dirInfo = session.ListDirectory(HomeDirectory);
if (dirInfo.Files.Any(
file => file.Name.Equals(FolderName, StringComparison.OrdinalIgnoreCase)))
{
// ...
}
我正在开发一个项目,在该项目中我使用 WinSCP .NET 组件访问 SFTP 主机。代码的功能是导航到 SFTP 中的文件夹并检查提供的文件名是否位于该文件夹内。
我有以下代码,一切正常。下面的代码检查文件夹是否存在于 SFTP 远程路径中。如果它在那里,我将遍历 sFTP 目录中的所有文件以检查它是否具有我提供的文件名。
string FolderName = row["Folder_Name"].ToString();
string FileName = row["File_Name"].ToString();
FileName = FileName.Replace("\r\n", string.Empty);
string remotePath = HomeDirectory + FolderName + "/";
if(session.FileExists(remotePath))
{
RemoteDirectoryInfo directory = session.ListDirectory(remotePath);
sFTPFiles.AddRange(directory.Files
.Where(fileInfo => !fileInfo.IsDirectory)
.Select(fileInfo => fileInfo.Name.ToString()));
if(CheckFileExists(FileName, sFTPFiles) != FileExistence.EXISTS)
{
isDiscrepancy = true;
} else
{
row["sftp_available"] = true;
row["discrepancy_on_sftp"] = false;
}
}
我面临的问题是文件夹名称区分大小写的问题。在我的数据库中,文件夹名称以大写形式存储。但在 SFTP 中,相同的文件夹名称具有不同的区分大小写的名称,即。大写或句子大小写或小写。类似于 folderNAME
、FOLDERNAME
、foldername
、fOLDERNAME
执行if(session.FileExists(remotepath)
时,由于区分大小写的问题而失败。当我正在验证的文件夹名称是 FOLDERNAME
并且 SFTP 中的相同名称被写为 FOLDERname
时,由于区分大小写,它被跳过。
因此谁能告诉我如何使用 WinSCP 和 C# 以不区分大小写的方法检查文件夹名称。我所需要的只是如果我的数据库中的 Foldername
是 FOLDERNAME
,我想在 SFTP 中导航到该文件夹,即使它是上述任何一种格式。
在此先感谢您的帮助。
SFTP 文件检查 API 遵循远程系统的约定。因此,如果远程系统区分大小写,则检查将区分大小写。你对此无能为力。
您所能做的就是检索完整的远程目录列表并自行进行不区分大小写的搜索。
要快速且不区分大小写地替换 Session.FileExists
,请使用:
if (session.ListDirectory(HomeDirectory).Files.Any(
file => file.Name.Equals(FolderName, StringComparison.OrdinalIgnoreCase)))
{
// ...
}
虽然很明显,如果您要在同一个文件夹中检查很多 files/subfolders,这将是无效的。在这种情况下,您最好缓存列表并重新使用它。
RemoteDirectoryInfo dirInfo = session.ListDirectory(HomeDirectory);
if (dirInfo.Files.Any(
file => file.Name.Equals(FolderName, StringComparison.OrdinalIgnoreCase)))
{
// ...
}