private static Object lock1 = new object();
    private static Object lock2 = new object();
    static void Main(string[] args)
    {
        Thread thread_write = new Thread(new ThreadStart(Write));
        thread_write.Start();        Thread thread_copy = new Thread(new ThreadStart(Move));
        thread_copy.Start();        Thread thread_move = new Thread(new ThreadStart(Move));
        thread_move.Start();    }
    private static void Write()
    {
        while (true)
        {
            System.Threading.Thread.Sleep(1000);
            File.WriteAllText(Path.Combine(@"D:\ConsoleAppWrite", Guid.NewGuid().ToString() + ".txt"), "Write......");
        }
    }
    private static void Copy()
    {
        while (true)
        {
            FileInfo[] file_infos = SortFiles(@"D:\ConsoleAppWrite", "*.txt");
            foreach (FileInfo fl in file_infos)
                CopyFileToFolder(fl, @"D:\ConsoleAppCopy");
        }
    }
    private static void Move()
    {
        while (true)
        {
            FileInfo[] file_infos = SortFiles(@"D:\ConsoleAppWrite", "*.txt");
            foreach (FileInfo fl in file_infos)
                MoveFileToFolder(fl, @"D:\ConsoleAppMove");
        }
    }
    #region Directory Utilities
    public static FileInfo[] SortFiles(string folder, string fileFilter)
    {
        if (Directory.Exists(folder))
        {
            DirectoryInfo dirInfo = new DirectoryInfo(folder);
            FileInfo[] sourceFileInfo = dirInfo.GetFiles(fileFilter, SearchOption.TopDirectoryOnly);
            Array.Sort(sourceFileInfo, new FileCreateTimeComparer());
            return sourceFileInfo;
        }
        return new FileInfo[] { };
    }    public static FileInfo MoveFileToFolder(FileInfo fileInfo, string destFolder)
    {
        string newFileFullName = Path.Combine(destFolder, fileInfo.Name);
        lock (lock1)
        {
            if (!File.Exists(newFileFullName))
            {
                File.Move(fileInfo.FullName, Path.Combine(destFolder, fileInfo.Name));
            }
        }
        return new FileInfo(newFileFullName);
    }    public static void CopyFileToFolder(FileInfo fileInfo, params string[] destFolders)
    {
        if (destFolders != null)
        {
            foreach (string destFolder in destFolders)
            {
                string newFileFullName = Path.Combine(destFolder, fileInfo.Name);
                lock (lock2)
                {
                    if (!File.Exists(newFileFullName))
                    {
                        File.Copy(fileInfo.FullName, Path.Combine(destFolder, fileInfo.Name));
                    }
                }
            }
        }
    }    public static string GetBakFolder(string currentFolder, DateTime fileCreateTime)
    {
        string bakFolder = string.Format(@"{0}\{1}\{2}\{3}", currentFolder, fileCreateTime.Year, fileCreateTime.Month, fileCreateTime.Day);
        if (!Directory.Exists(bakFolder))
        {
            Directory.CreateDirectory(bakFolder);
        }
        return bakFolder;
    }
    #endregion

解决方案 »

  1.   

    lock (lock1)
      {
      if (!File.Exists(newFileFullName))
      {
      File.Move(fileInfo.FullName, Path.Combine(destFolder, fileInfo.Name));
      }
      
    不起作用,如何互斥?
      

  2.   

    你的互斥应该放到Move函数中,否则,其他线程会对你获取的文件信息进行更改
      

  3.   

      private static void Move()
            {
                while (true)
                {
                    lock (lock1)
                    {
                        FileInfo[] file_infos = SortFiles(@"D:\ConsoleAppWrite", "*.txt");
                        foreach (FileInfo fl in file_infos)
                            MoveFileToFolder(fl, @"D:\ConsoleAppMove");
                    }
                }
            }
    照样是: 进程占用,不能解决问题!
      

  4.   

    多lock几个地方明显是同步问题
      

  5.   

    哈哈!能lock的地方都 lock了,就是不行!
      

  6.   

    还lock  越多越出问题 先检查执行顺序