Программно перемещать файлы после проверки на вирусы - PullRequest
0 голосов
/ 16 августа 2011

Можно ли программно перемещать файлы в зависимости от состояния проверки на вирусы?

То, что я хочу сделать, это иметь набор папок:

Входящий Отсканированные Отсканированные / Clean Отсканированные / Infected Не отсканировано

Файлы будут помещены в папку «Входящие». В этот момент я бы хотел запустить антивирус и проверить файлы в папке «Входящие». После завершения файлы должны быть перемещены в соответствующую папку, либо чистую, либо зараженную. Если по какой-либо причине файл не может быть отсканирован или возникли проблемы со сканированием, он будет перемещен в папку «Не сканировано».

Я надеялся, что будет способ написать это. Кто-нибудь когда-либо делал что-то подобное раньше?

1 Ответ

1 голос
/ 25 марта 2014
public void Scan()
{
    string[] uploadPath = Directory.GetFiles(ConfigurationManager.AppSettings["UploadPath"]);

    foreach(string filePath in uploadPath)
    {
        string fileName = Path.GetFileName(filePath);
        string cleanPath = Path.Combine(ConfigurationManager.AppSettings["CleanPath"], fileName);

        try
        {
            Process AV = new Process();

            AV.StartInfo.UseShellExecute = false;
            AV.StartInfo.RedirectStandardOutput = true;
            AV.StartInfo.FileName = ConfigurationManager.AppSettings["VSApp"];
            AV.StartInfo.Arguments = " -Scan -ScanType 3 -file " + ConfigurationManager.AppSettings["UploadPath"] + " -DisableRemediation";

            AV.Start();

            string output = AV.StandardOutput.ReadToEnd();
            AV.WaitForExit();

            if (AV.ExitCode == 0)
            {
                File.Move(filePath, cleanPath);
            }

            else if (AV.ExitCode == 2)
            {
                using (TextWriter tw = new StreamWriter(ConfigurationManager.AppSettings["FailedPath"] + fileName + ".txt"))
                {
                    tw.WriteLine("2");
                    tw.Close();
                }

                using (TextWriter tw1 = new StreamWriter(ConfigurationManager.AppSettings["FailedFiles"] + fileName + ".txt"))
                {
                    tw1.WriteLine(AV.StandardOutput);
                    tw1.Close();
                }

                File.Delete(filePath);
            }

            AV.Close();
        }

        catch (Exception ex)
        {
            if (ex.ToString().Contains("Could not find file"))
            {
                string failedFile = ConfigurationManager.AppSettings["FailedPath"] + fileName + ".txt";
                string failedFileDesc = ConfigurationManager.AppSettings["FailedPath"] + fileName + "_ErrorDesc" + ".txt";
                using (TextWriter tw = new StreamWriter(failedFile))
                {
                    tw.WriteLine("2");
                    tw.Close();
                }

                using (TextWriter tw1 = new StreamWriter(failedFileDesc))
                {
                    tw1.WriteLine(ex.ToString());
                    tw1.Close();
                }
            }

            else
            {                       
                Thread.Sleep(2000);
                if (runCounter == 0)
                {
                    Scan();
                }
                runCounter++;

                string errorFile = ConfigurationManager.AppSettings["ProcessErrorPath"] + fileName + ".txt";
                using (TextWriter tw = new StreamWriter(errorFile))
                {
                    tw.WriteLine(ex.ToString());
                    tw.Close();
                }
            }
        }
    }
}

Я создал это как службу Windows.Мой метод OnStart создает мой FileSystemWatcher для просмотра пути загрузки.Для «При создании» у меня есть метод, который запускает мой метод сканирования, создает мой счетчик и устанавливает его на 0. Событие «Моя ошибка» просто регистрируется.У меня была проблема, когда FileSystemWatcher пытался открыть файл перед его загрузкой, поэтому я добавил спящий режим.

Наконец, я использую сканер командной строки Microsoft Forefront.Путь к файлу: C: \ Program Files \ Microsoft Security Client \ mpcmdrun.exe.

Дайте мне знать, если возникнут вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...