2

あるディレクトリに書き込まれたすべてのファイルを別のディレクトリに移動する単純なアプリを作成しようとしています。それが私の問題です。ディレクトリに一度に10000個以外のファイル(1KBを超える小さな.txtファイル)を書き込むと、それらの一部は出力ディレクトリへの移動を処理しません。この問題を解決するためにFileSystemWatcherイベントハンドラーを使用しています。これが私のコード例です:

Class MyProgramm
{
    void Process(Object o, FileSystemEventArgs e)
    {
        //do something with e.Name file
    }
    void main()
    {
        var FSW = New FileSystemWatcher{Path = "C:\\InputDir"};
        FSW.Created += Process;
        FSW.EnableRisingEvents = true;
        Thread.Sleep(Timeout.Infinite);
    }
}

最後に、いくつかのファイルを処理しましたが、書き込まれたファイルのいくつかは未処理のままです。何か提案はありますか?

4

1 に答える 1

0

FileSystemWatcherでも同様の問題が発生しました。かなり定期的に「ボールを落とす」ようでした。Windowsサービスとして稼働して以来一貫して機能している「ServiceBase」を拡張することで、別のソリューションを探しました。お役に立てれば:

    public partial class FileMonitor : ServiceBase
    {
        private Timer timer;
        private long interval;
        private const string ACCEPTED_FILE_TYPE = "*.csv";

        public FileMonitor()
        {           
            this.ServiceName = "Service";
            this.CanStop = true;
            this.CanPauseAndContinue = true;
            this.AutoLog = true;
            this.interval = long.Parse(1000);
        }

        public static void Main()
        {
            ServiceBase.Run(new FileMonitor());
        }

        protected override void OnStop()
        {
            base.OnStop();
            this.timer.Dispose();
        }

        protected override void OnStart(string[] args)
        {
            AutoResetEvent autoEvent = new AutoResetEvent(false);
            this.timer = new Timer(new TimerCallback(ProcessNewFiles), autoEvent, interval, Timeout.Infinite);
        }

        private void ProcessNewFiles(Object stateInfo)
        {
            DateTime start = DateTime.Now;
            DateTime complete = DateTime.Now;

            try
            {
                string directoryToMonitor = "c:\mydirectory";
                DirectoryInfo feedDir = new DirectoryInfo(directoryToMonitor);
                FileInfo[] feeds = feedDir.GetFiles(ACCEPTED_FILE_TYPE, SearchOption.TopDirectoryOnly);             

                foreach (FileInfo feed in feeds.OrderBy(m => m.LastWriteTime))
                {
                    // Do whatever you want to do with the file here
                }
            }
            finally
            {
                TimeSpan t = complete.Subtract(start);
                long calculatedInterval = interval - t.Milliseconds < 0 ? 0 : interval - t.Milliseconds;
                this.timer.Change(calculatedInterval, Timeout.Infinite);
            }
        }       
    }
于 2012-09-05T10:20:47.210 に答える