我有两个相同的进程在两台不同的计算机上运行,这些计算机正在访问第三台计算机中的共享文件夹。此共享文件夹具有目录。因此,如何确保这两个处理器不访问并开始处理同一文件夹。换句话说,如果一个已经在其上工作的人跳过那个目录。
我尝试使用File.Create()方法在目录上创建临时文件 MSDN声明
此方法创建的FileStream对象具有默认的FileShare 无价值;没有其他进程或代码可以访问创建的文件 直到原始文件句柄关闭。
所以我的逻辑是如果临时文件已经存在,或者在尝试创建它时抛出异常,则跳过该目录。
不幸的是,这似乎不起作用。所以我的问题是
即使在文件中创建了文件,MSDN所说的也是如此 由运行在不同计算机上的处理器共享文件夹或是它 仅对本地驱动器有效
实现我想要做的事情的方法
答案 0 :(得分:2)
您最好的选择是创建 true 临时文件。
在目录处理中使用此代码:
public void ProcessDirectory(string path)
{
using (var lockFile = File.Create(Path.Combine(path, "process.lock"), 256, FileOptions.DeleteOnClose))
{
// process the directory here
}
}
注意那里的FileOptions.DeleteOnClose
。即使您的进程在此处异常终止,文件系统也会在您关闭文件时为您删除该文件。在异常终止的情况下,文件被关闭作为进程拆除的一部分。在硬电源故障的情况下,文件可能会被遗忘。
请注意,如果此方法已经锁定,此方法将抛出IOException
,您需要处理此问题并继续。
答案 1 :(得分:1)
你的想法是正确的,也许你在实施中犯了错误?
这是工作代码
private const string _lockFileName = @"c:\whatever\lock";
private FileStream _lockFile;
public bool Lock()
{
try
{
_lockFile = File.Open(_lockFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
return true;
}
catch { } // perhaps a certain exception type?
return false;
}
public void Unlock()
{
if(_lockFile != null)
{
_lockFile.Close();
File.Delete(_lockFileName);
_lockFile = null;
}
}
在使用文件夹调用Lock()
开始时,仅在文件夹返回true
时才使用该文件夹。在结束通话Unlock()
时,即使Lock()
返回false
,也可安全致电。
答案 2 :(得分:0)
开始处理时,可以在目录中编写lock.conf文件。然后,在完成后删除文件(释放锁定)。
两个考虑因素: