1

デザイナーですべての FSW プロパティを設定しました (EnableRaisingEvents = true、フィルター = *.tif、IncludeSubdirectories = true、パス = bla\bla\bla)。

アプリケーションは Windows Server 2008 R2 Standard マシンで実行され、ローカル フォルダーで作成されたファイルを監視します。「C:\」の代わりに、コンピューターのネットワーク名「GRAHAM」を使用します。

問題は、監視対象のディレクトリにファイルが作成/移動されたときに、FSW が常に起動するとは限らないことです。時々そうであるように見えますが、ほとんどの場合そうではありません。

私のマシンからそのフォルダーをデバッグして監視すると、奇妙な動作もあります。サーバー マシンをリモートで制御し、ファイルを監視フォルダーに移動しても、何も起こりません。しかし、ファイルを共有ネットワーク フォルダから監視フォルダに移動すると、毎回 FSW が起動します。

これにより、エラー/バグを見つけるのが非常に難しくなります。誰でもアイデアはありますか?

これは文字通りすべてのコードです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Ekonomikompetens_unikt_namn
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
        {
            StringBuilder log = new StringBuilder();

            try
            {
                log.Append("--------------------").AppendLine().Append(DateTime.Now).AppendLine().Append("--------------------").AppendLine();

                FileInfo file = new FileInfo(e.FullPath);

                while (IsFileLocked(file))
                {
                    System.Threading.Thread.Sleep(300);
                }
                string oFile = e.FullPath;
                string nFile = oFile.Insert(oFile.Length - 4, "_" + DateTime.Now.ToString().Replace(" ", "").Replace("-", "").Replace(":", "")).Replace("\\XML Konvertering", "").Replace(@"\\GRAHAM\AnyDoc Invoices", @"\\FAKTURASERVER\AnyDoc");

                if (!Directory.Exists(nFile.Substring(0, nFile.LastIndexOf('\\'))))
                {
                    Directory.CreateDirectory(nFile.Substring(0, nFile.LastIndexOf('\\')));
                    File.Move(oFile, nFile);
                    Directory.Delete(oFile.Substring(0, oFile.LastIndexOf('\\')));
                }
                else
                {
                    File.Move(oFile, nFile);
                }

                log.Append("* Moved and stamped file: ").AppendLine().Append(oFile).Append(" to ").Append(nFile).AppendLine().Append("--------------------").AppendLine();

            }
            catch (Exception x)
            {
                log.AppendLine().Append("*** ERROR *** ").Append(x).AppendLine().AppendLine();
            }
            finally
            {
                TextWriter tw = new StreamWriter(@"C:\tidslog\log.txt", true, Encoding.Default);
                //TextWriter tw = new StreamWriter(@"C:\PROJEKT\tidsstämplarn\log.txt", true, Encoding.Default);
                tw.Write(log);
                tw.Dispose();
            }
        }

        protected virtual bool IsFileLocked(FileInfo file)
        {
            FileStream stream = null;
            try
            {
                stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            }
            catch (IOException)
            {
                return true;
            }
            finally
            {
                if (stream != null)
                    stream.Close();
            }
            return false;
        }
    }
}

注: try-catch-finally はおそらくあまりよくできていませんが、私はコーディングが初めてで、「キャッチ」する方法がよくわかりませんが、ロガーはエラーをログに記録したことはありません。FSW は起動しないため、エラーが発生する可能性はありません。私は推測しています。

4

1 に答える 1