0

重複の可能性:
C# - ファイルが存在するかどうかを時々確認し、そこから読み取る

ファイルウォッチャーを使用して、ファイルがディレクトリに作成されたかどうかを確認しています。もしそうなら、それを開いて別のディレクトリに移動したいと思います。

私のアプローチはFileShare.None、排他的アクセスを確保するためにも使用します。私がしたことは次のとおりです。

class Program
    {
        private static void Main(string[] args)
        {
            FileSystemWatcher fileWatcher = new FileSystemWatcher();
            fileWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            fileWatcher.Created += fileWatcher_Created;
            fileWatcher.EnableRaisingEvents = true;
            Console.ReadLine();
        }

        private static void fileWatcher_Created(object sender, FileSystemEventArgs e)
        {
            WorkOnFile(e.FullPath);   
        }


        //must be done completely. How do I ensure it?
        private static void WorkOnFile(string fileName)
        {
            using (FileStream f = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
            {
                Thread.Sleep(40000); // some long operations
            }            
        }
  }

WorkOnFile()肝心なのは、 1 つのファイルに対して完全に 1 回だけ実行する必要があるということです。ファイルがコピーされている場合は、ファイルWorkOnFile()が完全にコピーされ、それを使用しているプロセスがなくなるまで、もう一度呼び出す必要があります。

どうすれば到達できますか?

4

2 に答える 2

0
//must be done completely. How do I ensure it?
    private static void WorkOnFile(string fileName)
    {
        while(true){
            try{
                using (FileStream f = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    Thread.Sleep(40000); // some long operations

                    break; //exit while() infinite loop
                }
            }
            catch(Exception e){
                //file is locked because being written. wait a few seconds then retry
                Thread.Sleep(10000);
            }     
        }       
    }
于 2012-09-25T18:35:18.013 に答える