indian143 Ответов: 1

Filesystemwatcher как задача расписания


Всем Привет,

Я разработал консольное приложение filesystemWatcher, когда я запускаю его, он ловит изменения файла, но когда мне нужно развернуть его как запланированную задачу, я не могу заставить его ловить изменения файла, потому что watcher работает в течение секунды, возможно, если файл уже там, он не будет ловить изменения.

Кто-нибудь может помочь мне в достижении этой задачи, я хочу, чтобы этот класс FileSystemWatcher забирал созданные или измененные файлы и помещал их путь и детали в таблицу.

Вот мой код:
public class Watcher
    {
        public static void Main(string[] args)
        {
            Run(args);
        }

        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
        public static void Run(string[] args)
        {
            // If a directory is not specified, exit program.
            if (args.Length < 1)
            {
                // Display the proper way to call the program.
                Console.WriteLine("Usage: Watcher.exe (directory)");
                return;
            }

            // Create a new FileSystemWatcher and set its properties.
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = args[0];
            /* Watch for changes in LastAccess and LastWrite times, and
               the renaming of files or directories. */
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
               | NotifyFilters.FileName | NotifyFilters.Size;// | NotifyFilters.DirectoryName;
            // Only watch text files.
            watcher.Filter = "*.*";

            // Add event handlers.
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnCreated);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            // Begin watching.
            watcher.EnableRaisingEvents = true;
            watcher.IncludeSubdirectories = true;

            // Wait for the user to quit the program.
            Console.WriteLine("Press \'q\' to quit the sample.");
            while (Console.Read() != 'q') ;
        }

        //Fires if file changed.
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            if (ExecutePackage(e.FullPath))
                File.Delete(e.FullPath);
        }

        //Fires if file Created.
        private static void OnCreated(object source, FileSystemEventArgs e)
        {            
            if (ExecutePackage(e.FullPath))
                File.Delete(e.FullPath);
        }

        //Fires if file Renamed.
        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            if (ExecutePackage(e.FullPath))
                File.Delete(e.FullPath);
        }

        /// 
        /// This is the root directory where the flat files are going to be loaded
        /// 
        private static bool ExecutePackage(string fileFullPath)
        {
            string errorDescription = string.Empty;
            DTSPackage _package = new DTSPackage();

            try
            {
                if (!File.Exists(fileFullPath))
                    return false;

                string strFileExt = (Path.GetExtension(fileFullPath) ?? string.Empty).ToLower();
                string directoryFullPath = Path.GetDirectoryName(fileFullPath) + @"\";
                string sourceFileName = Path.GetFileNameWithoutExtension(fileFullPath);

                if (Regex.IsMatch(strFileExt, @"\.txt|\.csv", RegexOptions.IgnoreCase))
                {
                    int result = WatcherDB.CallGetImportMetaData(fileFullPath);

                    if (result >= 1)
                        return true; 
                }
            }            
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.StackTrace, "Exception Details");
            }
            finally
            {
                _package.ClearPackage();
            }
            MessageBox.Show(errorDescription);
            return false;
        }
    }


Что я уже пробовал:

Я ищу в google и спрашиваю у друзей и т. д.

1 Ответов

Рейтинг:
2

#realJSOP

Почему вы планируете задачу? Если вы просто позволите приложению работать все время, оно будет обнаруживать изменения файловой системы всякий раз, когда они происходят. Вместо этого подумайте о написании службы Windows. Они загружаются/выполняются при запуске системы и могут работать без входа пользователя в систему.


[no name]

Причина в том, что существует множество подобных приложений, и нам нужно передавать им аргументы командной строки. Есть ли в любом случае сделать то же самое с помощью запланированных задач, даже если его служба Windows должна запускаться и останавливаться, тогда я не знаю, как FileSystemWatcher подхватывает, когда файл был создан когда-то раньше?
FileSystemWatcher ловит только файлы, которые создаются или изменяются при его запуске, как я могу поймать файлы, которые уже существуют в папке.

#realJSOP

Если вы настаиваете на том, чтобы сделать это таким образом, вам придется сканировать папку вручную либо до, либо после запуска FileSystemWatcher.