воскресенье, 20 марта 2011 г.

Интересная автоматизация.


недавно мой друг попросил меня написать ему программу, которая должна уметь определять, что к компьютеру была присоединена флешка и после этого должна выполнить некоторые действия.
ему хотелось, чтобы с компьютера были скопированы необходимые файлы на флешку.
я подумал и не стал реализовывать всяческое копирование, а сделал основу для модульной автоматизации ;)

программа была написана на c#. через заданный промежуток времени проверяет наличие removable диска с заданной меткой. после этого запускает cmd файл и передает ему в качестве параметра имя диска.
программа запускается из командной строки безо всякой формы. в качестве параметра передается файл в котором заданы параметры (в каждой строке): метка диска, интервал обновления, путь к cmd файлу.

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace Copy2Flash
{
    static class Program
    {
        private static bool isSyncOk;
        private static String diskLabelName;
        private static int timeInterval = 1000;
        private static String execFilePath;


        [STAThread]
        static void Main(string[] args)
        {
            if (args != null && args.Length > 0)
            {
                String iniFilePath = args[0];

                if (File.Exists(iniFilePath))
                {
                    try
                    {
                        var file = new StreamReader(iniFilePath);

                        try
                        {
                            diskLabelName = file.ReadLine();
                            timeInterval = Convert.ToInt32(file.ReadLine());
                            execFilePath = file.ReadLine();
                        }
                        catch
                        {
                        }
                        finally
                        {
                            file.Close();
                        }
                    }
                    catch
                    {
                    }
                }
            }

            var timer = new Timer();
            timer.Tick += TimerEventProcessor;
            timer.Interval = timeInterval;
            timer.Start();
            Application.Run();
            timer.Stop();
        }

        private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
        {
            var removableDrives = from d in DriveInfo.GetDrives() where d.DriveType == DriveType.Removable select d;
            //var removableDrives = DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.Removable);

            bool isDiskFound = false;
            string driveName = null;

            foreach (var removableDrive in removableDrives)
            {
                if (removableDrive.IsReady)
                {
                    if (!String.IsNullOrEmpty(diskLabelName) && removableDrive.VolumeLabel.ToLower() == diskLabelName.ToLower())
                    {
                        isDiskFound = true;
                        driveName = removableDrive.Name;
                        break;
                    }
                }
            }

            if (isDiskFound && !isSyncOk)
            {
                if (!String.IsNullOrEmpty(execFilePath))
                {
                    try
                    {
                        var process = new Process();

                        var pInfo = new ProcessStartInfo(execFilePath, driveName);
                        pInfo.WindowStyle = ProcessWindowStyle.Hidden;

                        process.StartInfo = pInfo;
                        process.Start();
                        process.WaitForExit();
                        //int exitCode = process.ExitCode;
                        process.Close();
                    }
                    catch
                    {
                    }
                }

                isSyncOk = true;
            }
            else if (!isDiskFound && isSyncOk)
            {
                isSyncOk = false;
            }
        }
    }
}