在Windows XP中是文件创建原子?

时间:2011-03-16 12:23:28

标签: c# windows file windows-xp atomic

HI, 我想在windows xp上使用文件系统作为两个进程之间的锁。 即,给定文件名“file_lock”,进程通过尝试创建来获取锁 如果文件“file_lock”尚不存在,则为“file_lock”。如果已经存在,则无法获得锁定。

FileStream fs=new FileStream("c:\\file_lock, FileMode.CreateNew);

这会有用吗?如果文件不存在原子文件,是否创建文件?

谢谢!

3 个答案:

答案 0 :(得分:7)

是的,它会起作用。但不如Mutex出于多种原因,包括:

  1. 如果用户无权创建该文件,该怎么办?
  2. 当您的应用崩溃时,系统会清除互斥锁。它不会为您删除您的文件。
  3. 为什么不必要地引入磁盘IO的开销和风险? (而且我不确定这是否可行,但是当文件打开时,用户可以重命名或移动它,对吗?)
  4. 这是更多的代码。

答案 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)

如果您想将该文件用作同步锁,我建议您进行下一步。

  1. 检查文件锁定/存在
  2. 如果文件被锁定,则其他进程正在运行
  3. 如果文件不存在或没有锁定,您可以查询
  4. 打开要求锁定的文件
  5. 此代码可以帮助您检查锁定。

    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!