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
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
{
if (!File.Exists(newFileFullName))
{
File.Move(fileInfo.FullName, Path.Combine(destFolder, fileInfo.Name));
}
不起作用,如何互斥?
{
while (true)
{
lock (lock1)
{
FileInfo[] file_infos = SortFiles(@"D:\ConsoleAppWrite", "*.txt");
foreach (FileInfo fl in file_infos)
MoveFileToFolder(fl, @"D:\ConsoleAppMove");
}
}
}
照样是: 进程占用,不能解决问题!