多线程 Move 文件,进程占用,如何解决?
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
...全文
相关推荐
基于move_base的循环导航程序
move_base是ROS中的一个核心组件,它负责规划、执行和调整机器人的全局和局部路径,以实现从一个位置到另一个位置的自主导航。move_base通常包括以下主要组件:1.
浅析PHP 中move_uploaded_file 上传中文文件名失败
遵循这些指导原则,可以有效解决PHP中move_uploaded_file上传中文文件名失败的问题,同时保持代码的清晰性和文件的正确处理。
Magisk模块:Move_Certificates-v1.9
Move_Certificates-v1.9模块是基于Magisk框架的一个插件,它解决了用户手动管理证书的繁琐问题,特别是对于那些需要频繁更换或添加证书的用户,提供了极大的便利。
C盘文件迁移工具Free Move v2.1.0.zip
Free Move v2.1.0的出现,就是为了有效解决这一问题。这款工具的操作流程简单易懂,用户可以轻松上手。
VB Move方法移动控件
在使用Move方法前,可能需要先暂时禁用锚定属性。- 在多线程环境中,为了避免竞态条件,需要确保在对控件进行操作时正确地同步线程。


