1

やあ、ビットマップ ファイルの保存進行状況が完了しているかどうかを確認しようとしています。ロック状態または UNC ジャーナルを使用できません。その理由は次のとおりです。

FileSystemWatcher を実行すると、ファイルの作成と変更が検出されます (フォルダーも..ですが、問題ではありません)。ここで、コピー/移動操作だけを期待していた場合、このすべてが問題になることはありません..問題は、DCC アプリケーションが機能するときに発生します (ここで例として PhotoShop を取り上げます)。

PSでファイルを開くとロックされます(これまでのところ非常に良好です)。ファイルを保存すると一時的に保存され、「魔法」が実行され、「新しい」ファイルが取得されます(PS.versionとファイル出力によって異なります) temp なしでファイルに直接書き込みます)。temp を使用する場合でも、ファイルを一定にロックし、Close は、保存後ではなく、アプリケーションでファイルを閉じるときにのみ unc ジャーナルに追加されます。終了した..

ここで私の問題を見ることができます.ファイルが変更された(または作成された)後にファイルをさらに処理するには、それが実際に有効で完全なビットマップファイルであるかどうかを知る必要があります。私はこれについて4日間検索して読んでいて、誰かがこれについて私を助けてくれるかどうか見てみたいと思いました.

create および change ハンドラーのみを含む短縮バージョンの Watcher クラスを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace spacename
{
  public class WatchDog2
  {
    private string RootPath;

    private FileSystemWatcher Watcher;

    // something running in the background chipping away at the cue
    private System.Timers.Timer Clock = new System.Timers.Timer(5000) { AutoReset = true };

    private List<FileSystemEventArgs> FileCheckList = new List<FileSystemEventArgs>();

    private bool CheckLock = false;

    #region Events

    public delegate void OnChangeHandler(object sender, FileSystemEventArgs e);
    public delegate void OnRenameHandler(object sender, RenamedEventArgs e);

    public event OnChangeHandler OnFileCreate;
    public event OnChangeHandler OnFolderCreate;

    public event OnChangeHandler OnFileChange;

    #endregion

    /// <summary>
    /// ctor
    /// </summary>
    public WatchDog2(string rootPath, string filter = "*.*")
    {
      RootPath = rootPath;

      var di = new DirectoryInfo(rootPath);

      if (di.Exists)
      {
        Watcher = new FileSystemWatcher(di.FullName, filter);

        Watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite |
                                NotifyFilters.FileName | NotifyFilters.DirectoryName;

        Watcher.IncludeSubdirectories = true;

        Watcher.InternalBufferSize = 65536; //64kb (max)
      }
      else
      {
        Watcher = new FileSystemWatcher();
      }

      Watcher.Created += Watcher_Created;
      Watcher.Changed += Watcher_Changed;

      Clock.Elapsed += Clock_Elapsed;
    }

    /// <summary>
    /// Create Handler
    /// </summary>
    void Watcher_Created(object sender, FileSystemEventArgs e)
    {
      if (Path.HasExtension(e.FullPath))
      {
        if (App.SupportedExtensions.Contains(Path.GetExtension(e.FullPath).ToLower()))
        {
          if (new FileInfo(e.FullPath).Exists)
          {
            FileCheckList.Add(e);

            Clock.Start();
          }
        }
      }
      else
      {
        if (OnFolderCreate != null)
          OnFolderCreate(sender, e);
      }
    }

    /// <summary>
    /// Change Handler
    /// </summary>
    void Watcher_Changed(object sender, FileSystemEventArgs e)
    {
      if (Path.HasExtension(e.FullPath))
      {
        if (App.SupportedExtensions.Contains(Path.GetExtension(e.FullPath).ToLower()))
        {
          if (new FileInfo(e.FullPath).Exists)
          {
            FileCheckList.Add(e);

            Clock.Start();
          }
        }
      } // no folder change catching
    }

    /// <summary>
    /// Queue check
    /// </summary>
    void Clock_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
      if (!CheckLock)
      {
        CheckLock = true;

        for (int i = 0; i < FileCheckList.Count; i++)
        {
          var fi = new FileInfo(FileCheckList[i].FullPath);

          if (fi.Exists)
          {
            if (fi.Length > 0) //add propper checks for bitmap validity
            {
              switch (FileCheckList[i].ChangeType)
              {
                case WatcherChangeTypes.Created:
                  if (OnFileCreate != null)
                    OnFileCreate(null, FileCheckList[i]);
                  break;

                case WatcherChangeTypes.Changed:
                  if (OnFileChange != null)
                    OnFileChange(null, FileCheckList[i]);
                  break;
              }
            }
          }
          else // if save was aborted
          {
            FileCheckList.RemoveAt(i);
          }
        }
        CheckLock = false;
      }
    }
  }
}

ほとんど忘れていました..私はこれをWPFアプリケーションのコンテキストで行っています。

時間を割いてくれてありがとう:)

4

0 に答える 0