2017-04-18 72 views
1

我们一直在为正在上传到我们系统的文件实施病毒扫描程序 - 这是一个C#web应用程序,我们使用nClam插件与之交谈一个ClamAV server。在一个非常基本的设置(copied from the nClam help),它看起来像这样使用nClam和ClamAV在C#中使用日语字符病毒扫描文件

 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

如果您尝试从程序中迭代目录中的文件名,会发生什么情况?你看到他们期望的文件吗?如果是这样,'String.Equals'是否与你的观察一致?你能用这个文件名自己做一个File.ReadAllBytes吗? –

+0

@PatrickHuizinga标准的C#应用​​程序没有问题看到文件和读取字节。只有当我传递到clam应用程序的路径时,它才会导致问题。 – loxdog

回答

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

我会而不是必须这样做,但现在我看不到更好的方法!