HI, 我想在windows xp上使用文件系统作为两个进程之间的锁。 即,给定文件名“file_lock”,进程通过尝试创建来获取锁 如果文件“file_lock”尚不存在,则为“file_lock”。如果已经存在,则无法获得锁定。
即
FileStream fs=new FileStream("c:\\file_lock, FileMode.CreateNew);
这会有用吗?如果文件不存在原子文件,是否创建文件?
谢谢!
答案 0 :(得分:7)
是的,它会起作用。但不如Mutex出于多种原因,包括:
答案 1 :(得分:0)
由于该问题已被标记为C#,因此该答案不再适用,但我希望将其保留,以防将来对其他人有所帮助。
如果您使用的是Java,则可以使用java.nio.channels.FileLock
。
要使用它,请执行以下操作:
import java.io.RandomAccessFile;
import java.nio.FileLock;
...
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileLock lock = raf.getChannel().tryLock(0L, Long.MAX_VALUE, false);
if (lock != null && lock.isValid()) {
// You've acquired the lock!
else {
// You did not acquire the lock
raf.close();
}
注意:这可以防止来自其他进程的访问,但不能访问其他进程。您需要使用自己的内部同步(锁定raf
可能会有效)。
答案 2 :(得分:-3)
如果您想将该文件用作同步锁,我建议您进行下一步。
此代码可以帮助您检查锁定。
public static bool isFileLocked(string filename)
{
if (!File.Exists(filename)) throw new FileNotFoundException("File not found!", filename);
FileStream fs = null;
try
{
fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
return false;
}
catch (IOException)
{
return true;
}
catch (Exception)
{
throw;
}
finally
{
if (fs != null)
{
fs.Close();
fs = null;
}
}
}
HTH!