1

いくつかのファイルを作成/配置するディレクトリがあります。filesystemwatcher が新しいファイルを検出すると、そのファイルを 2 番目のディレクトリにコピーします。しかし、dir1に直接ファイルを作成すると、別のプログラムで使用されていると言ってシャットダウンします。

この問題を解決するにはどうすればよいですか?

ここに私のコードがあります:

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

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

    private bool pause = false;
    String source = ConfigurationManager.AppSettings[@"Directory1"];
    String target = ConfigurationManager.AppSettings[@"Directory2"];

    private void start()
    {
        pause = true;
        Start.Text = "Pause";
        fileSystemWatcher1.EnableRaisingEvents = true;
    }



    static void config()
    {
        foreach (string key in ConfigurationManager.AppSettings)
        {
            string value = ConfigurationManager.AppSettings[key];
            MessageBox.Show(value);
        }
    }

    private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
    {
            listBox1.Items.Add("File changed> " + e.FullPath + " -Date:" + DateTime.Now);
    }

    private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
    {
            listBox1.Items.Add("File created> " + e.FullPath + " -Date:" + DateTime.Now);
            File.Copy(e.FullPath , Path.Combine(target,e.Name));
    }

    private void fileSystemWatcher1_Deleted(object sender, System.IO.FileSystemEventArgs e)
    {
            listBox1.Items.Add("File deleted> " + e.FullPath + " -Date:" + DateTime.Now);
    }

    private void fileSystemWatcher1_Renamed(object sender, System.IO.RenamedEventArgs e)
    {
            listBox1.Items.Add("File renamed> " + e.FullPath + " -Date:" + DateTime.Now);
    }

    private void Start_Click(object sender, EventArgs e)
    {
        fileSystemWatcher1.Path = source;
        if (!pause)
        {
            start();
        }
        else
        {
            pause = false;
            Start.Text = "Start";
            fileSystemWatcher1.EnableRaisingEvents = false;   

        }

        }
    }
}
4

3 に答える 3

1

ファイルの読み取りまたは書き込み時にロックの問題が発生した場合は、FileShareオプションを確認してください。

このリンクをご確認ください。

于 2013-06-20T07:50:32.263 に答える
1

同じ問題ではありませんが、原因は同じです。解決策はあなたにとって良いことがあります。

このアプローチの典型的な問題は、イベントがトリガーされている間にファイルがまだコピーされていることです。コピー中にファイルがロックされるため、明らかに例外が発生します。大きなファイルでは特に例外が発生する可能性があります。

回避策として、最初にファイルをコピーしてから名前を変更し、名前変更イベントをリッスンすることができます。

または、別のオプションとして、ファイルを書き込みアクセスで開くことができるかどうかを確認する while ループを使用することもできます。それができれば、コピーが完了したことがわかります。C# コードは次のようになります (実稼働システムでは、while(true) の代わりに再試行またはタイムアウトの最大回数が必要になる場合があります)。

(ここからコピー:複数のファイルがディレクトリに追加されたときのFileSystemWatcherでのファイルアクセスエラー

于 2013-06-20T07:50:39.623 に答える
1

名前の変更と作成が同時に行われています。その時点で既に名前の変更に使用されているため、コピーすることはできません..

于 2013-06-20T07:53:59.637 に答える