2011-03-16 48 views
3

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

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

将这项工作?如果文件尚不存在原子文件,是文件创建?

谢谢!

+0

它怎么会不是原子?然后两个进程可以创建具有相同名称的不同文件。 – 2011-03-16 14:06:06

+0

移动不是原子..... – Jacko 2011-03-16 14:11:13

+0

移动是复制和删除的别名,创建是创建。 – SubniC 2011-03-16 14:19:16

回答

-3

如果你想使用该文件作为同步锁,我建议你下一个过程。存在

    1. 检查文件锁定/如果文件被锁定的其他进程工作
    2. 如果文件不存在,或者有没有锁,你可以adquire它
    3. 打开文件adquiring的锁

    此代码可以帮助您检查锁。

    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!

  • +0

    谢谢。但是,它是原子吗? – Jacko 2011-03-16 14:03:13

    +0

    downvote的任何理由? – SubniC 2011-03-16 14:03:51

    +0

    你是什么意思与原子?我不明白的上下文... – SubniC 2011-03-16 14:05:34

    7

    是的,它会工作。但不如Mutex有很多原因,包括:

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

    谢谢。在我的情况下,我管理本地缓存在磁盘上,缓存视频帧数据。每个框架放在它自己的文件夹中。我需要每帧一个锁,所以这就是我选择基于文件的方法的原因。另外,我喜欢锁定文件在崩溃时没有清理的事实;这给我提供了有关文件夹写入是否正确的信息,或者是在崩溃之前仅部分写入的信息。 – Jacko 2011-03-16 14:02:21

    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可能会工作)。

    +0

    风格,特别是符号常量的名称,看起来更像C#而不是Java。 – 2011-03-16 13:28:05

    +0

    @Ben它确实,但没有语言标签,可以认为任何在XP上运行的语言都是可以接受的。上面的代码片段对我来说看起来像伪代码。 – Jonathan 2011-03-16 13:42:15

    相关问题