Сканирование на вирусы файлов с японскими иероглифами в 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);

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


person loxdog    schedule 18.04.2017    source источник
comment
Что произойдет, если вы попытаетесь повторить имена файлов в этом каталоге из вашей программы? Вы видите файл, который вы ожидаете среди них. И если да, то согласен ли String.Equals с вашим наблюдением? Можете ли вы сделать File.ReadAllBytes самостоятельно с этим именем файла?   -  person Patrick Huizinga    schedule 19.04.2017
comment
@PatrickHuizinga, стандартное приложение C #, без проблем видит файл и читает в байтах. Только когда я передаю путь к приложению-моллюске, это вызывает проблему.   -  person loxdog    schedule 19.04.2017


Ответы (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;
}

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

person loxdog    schedule 21.04.2017