使用 WinSCP 和 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 中,相同的文件名称具有不同的区分大小写的名称,即。大写或句子大小写或小写。类似 folderNAMEFOLDERNAMEfoldernamefOLDERNAME

if(session.FileExists(remotepath) 被执行时,由于区分大小写的问题,它会失败。当我正在验证的文件名称FOLDERNAME 并且 SFTP 中的相同写为 FOLDERname 时,由于区分大小写,它会被跳过。

因此,任何人都可以让我知道如何使用 WinSCP 和 C# 以不区分大小写的方法检查文件名称。我所需要的只是如果我的数据库中的 FoldernameFOLDERNAME,我想在 SFTP 中在该文件夹中导航,即使它是上述任何格式。

预先感谢您的帮助。

解决方法

SFTP 文件检查 API 遵循远程系统的约定。因此,如果远程系统区分大小写,则检查将区分大小写。你对此无能为力。

您所能做的就是检索完整的远程目录列表并自己进行区分大小写的搜索。


要快速且不区分大小写的 Session.FileExists 替换,请使用:

if (session.ListDirectory(HomeDirectory).Files.Any(
        file => file.Name.Equals(FolderName,StringComparison.OrdinalIgnoreCase)))
{
    // ...
}

虽然很明显,如果您要检查同一文件夹中的大量文件/子文件夹,这将是无效的。在这种情况下,您最好缓存列表并重新使用它。

RemoteDirectoryInfo dirInfo = session.ListDirectory(HomeDirectory);
if (dirInfo.Files.Any(
        file => file.Name.Equals(FolderName,StringComparison.OrdinalIgnoreCase)))
{
    // ...
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...