2017-04-18 74 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; 
} 

我會而不是必須這樣做,但現在我看不到更好的方法!