使用nClam和ClamAV在C#中使用日文字符扫描病毒文件

时间:2017-04-18 08:54:13

标签: c# .net virus-scanning clam nclam

我们一直致力于为上传到我们系统的文件实施病毒扫描程序 - 它是一个C#网络应用,我们使用nClam插件与{{3}进行通信}。在一个非常基本的设置(ClamAV server)中,它看起来像这个

     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;
        }

现在当我尝试运行它时,我总是会从扫描中得到一个错误 - 文件本身只是一个包含一些随机字符的文本文件。我得到的错误是"没有这样的错误文件或目录。 ERROR"

如果我运行ClamAV控制台命令扫描文件夹中的文件,它似乎工作正常。我认为这是一个解码路径的问题,但我尝试了各种编码方案,但它似乎没有用。

在nClam方法中,有一些代码将文件路径解析为ClamAV服务器的命令

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

这会影响日文字符吗?

1 个答案:

答案 0 :(得分:0)

我遇到的解决方案是将文件名中的所有日语(和其他不支持的)字符替换掉,并在病毒扫描后使用真实的文件名,即

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

我宁愿不必这样做但是现在我看不到更好的方法!