Проверка на вирусы файлов с японскими символами в C# с использованием nClam и ClamAV

Мы работали над реализацией процедуры проверки на вирусы для файлов, загружаемых в нашу систему - это веб-приложение на C#, где мы использовали плагин nClam для общения с сервером ClamAV. В очень простой настройке ( скопированной из справки nClam) это выглядит так

     string filePath = "C:\\test\\jp TEST 昨夜のコンサート.txt";

        var clam = new ClamClient("localhost", 3310);
        var scanResult = clam.ScanFileOnServer(filePath);  //any file you would like!

        Console.WriteLine("Japan test");
        switch (scanResult.Result)
        {
            case ClamScanResults.Clean:
                Console.WriteLine("The file is clean!");
                break;
            case ClamScanResults.VirusDetected:
                Console.WriteLine("Virus Found!");
                Console.WriteLine("Virus name: {0}", scanResult.InfectedFiles.First().VirusName);
                break;
            case ClamScanResults.Error:
                Console.WriteLine("Woah an error occured! Error: {0}", scanResult.RawResult);
                break;
        }

Теперь, когда я пытаюсь выполнить это, я всегда получаю сообщение об ошибке после сканирования - сам файл является просто текстовым файлом с некоторыми случайными символами. Я получаю сообщение об ошибке "Нет такого файла или каталога. ОШИБКА"

Если я запускаю консольную команду ClamAV для сканирования файлов в папке, похоже, она работает нормально. Я думаю, что это проблема декодирования пути, но я пробовал различные схемы кодирования, и это, похоже, не работает.

В методе nClam есть некоторый код, который анализирует путь к файлу в команду для сервера ClamAV

var commandText = String.Format("z{0}\0", command);
var commandBytes = Encoding.UTF8.GetBytes(commandText);

Может ли это повлиять на японские символы?

1 ответ

Решение, которое я получил, состоит в том, чтобы просто заменить все японские (и другие не поддерживаемые) символы в имени файла и использовать настоящее имя файла после проверки на вирусы, т.е.

private string ReplaceUnsupportedCharacters(string fileName)
{
  const int MaxAnsiCode = 255;
  foreach (var illegalChar in fileName.Where(c => c > MaxAnsiCode))
  {
    fileName = fileName.Replace(illegalChar, '-');
  }
  return fileName;
}

Я бы предпочел не делать этого, но сейчас я не вижу лучшего способа!

Другие вопросы по тегам