HI, 我想使用文件系统作为Windows xp上两个进程之间的锁。 即给定文件名“file_lock”,如果文件“file_lock”不存在,则通过尝试创建文件“file_lock”来获得该锁。如果已经存在,则无法获得锁定。是windows xp中的文件创建原子吗?
即
FileStream fs=new FileStream("c:\\file_lock, FileMode.CreateNew);
将这项工作?如果文件尚不存在原子文件,是文件创建?
谢谢!
HI, 我想使用文件系统作为Windows xp上两个进程之间的锁。 即给定文件名“file_lock”,如果文件“file_lock”不存在,则通过尝试创建文件“file_lock”来获得该锁。如果已经存在,则无法获得锁定。是windows xp中的文件创建原子吗?
即
FileStream fs=new FileStream("c:\\file_lock, FileMode.CreateNew);
将这项工作?如果文件尚不存在原子文件,是文件创建?
谢谢!
如果你想使用该文件作为同步锁,我建议你下一个过程。存在
此代码可以帮助您检查锁。
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!
是的,它会工作。但不如Mutex有很多原因,包括:
谢谢。在我的情况下,我管理本地缓存在磁盘上,缓存视频帧数据。每个框架放在它自己的文件夹中。我需要每帧一个锁,所以这就是我选择基于文件的方法的原因。另外,我喜欢锁定文件在崩溃时没有清理的事实;这给我提供了有关文件夹写入是否正确的信息,或者是在崩溃之前仅部分写入的信息。 – Jacko 2011-03-16 14:02:21
由于该问题已被标记为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
可能会工作)。
风格,特别是符号常量的名称,看起来更像C#而不是Java。 – 2011-03-16 13:28:05
@Ben它确实,但没有语言标签,可以认为任何在XP上运行的语言都是可以接受的。上面的代码片段对我来说看起来像伪代码。 – Jonathan 2011-03-16 13:42:15
它怎么会不是原子?然后两个进程可以创建具有相同名称的不同文件。 – 2011-03-16 14:06:06
移动不是原子..... – Jacko 2011-03-16 14:11:13
移动是复制和删除的别名,创建是创建。 – SubniC 2011-03-16 14:19:16