标签: file-locking

我可以使用FileStream实现文件锁吗?

我可以使用FileStream构造函数来确保一次只有一个进程访问文件吗?以下代码是否有效?

public static IDisposable AcquireFileLock() {
    IDisposable lockObj;
    do {
        // spinlock - continually try to open the file until we succeed
        lockObj = TryOpenLockFile();

        // sleep for a little bit to let someone else have a go if we fail
        if (lockObj == null) Thread.Sleep(100); 
    }
    while (lockObj == null);

    return lockObj;
}

private static FileStream TryOpenLockFile() {
    try {
        return new FileStream(s_LockFileName, FileMode.Create, FileAccess.Read, FileShare.None);
    }
    catch (IOException) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

特别是,FileMode.Create原子WRT …

.net file-locking filestream

5
推荐指数
1
解决办法
836
查看次数

在单个JVM和多个JVM中使用java文件锁

我想我错过了一些东西,但我无法理解文件锁如何在Java中工作.更确切地说 - 它是如何实现的.

我似乎无法获取(甚至无法尝试获取)单个JVM内的同一文件的两个或更多锁.将成功获取第一个锁,所有进一步尝试获取更多锁将导致OverlapingFileLockException.然而,它适用于单独的过程.

我想实现由文件系统支持的数据存储,该数据存储旨在处理多个并发请求(读取和写入).我想使用文件锁来锁定存储中的特定文件.

似乎我必须在JVM级别上引入一个同步(独占),然后才对文件进行同步以避免此异常.

有人这样做过吗?

我准备了简单的测试用例来说明我的问题.我使用的是Mac OS X,Java 6.

import junit.framework.*;

import javax.swing.*;
import java.io.*;
import java.nio.channels.*;

/**
 * Java file locks test.
 */
public class FileLocksTest extends TestCase {
    /** File path (on Windows file will be created under the root directory of the current drive). */
    private static final String LOCK_FILE_PATH = "/test-java-file-lock-tmp.bin";

    /**
     * @throws Exception If failed.
     */
    public void testWriteLocks() throws Exception {
        final File file = new File(LOCK_FILE_PATH);

        file.createNewFile();

        RandomAccessFile raf = …
Run Code Online (Sandbox Code Playgroud)

java nio file-locking

5
推荐指数
2
解决办法
9846
查看次数

PHP进程/服务器崩溃时如何避免文件死锁?

我是PHP的新手.据我所知,flock()当两个用户访问将内容添加到可锁定文件的相同php文件时,我可以使用锁定文件并避免竞争条件.

但是,如果php进程崩溃会发生什么?等待可锁定文件的下一个用户会发生什么?如果服务器崩溃(某人拔插头)会发生什么?锁是否自动释放?重启服务器后文件是否会保持锁定状态?

为了简化,PHP是否确保正确处理这些危急情况(即未明确释放的锁定)?如果没有,应该如何处理这些情况?如何从这些中恢复?

php crash release file-locking

5
推荐指数
1
解决办法
1014
查看次数

当网络丢失时,Delphi使用TFilestream写入网络共享会锁定文件

我试图使用TFilestream写入网络共享(本地).如果网络连接没有中断,一切正常.

但是,如果我拉网线然后重新连接,则由于访问限制而导致打开文件流的后续尝试失败.我甚至无法删除资源管理器中的文件!似乎TFilestream锁定文件,解决这个问题的唯一方法是重启.

在我的应用程序中,我在写入文件的整个过程中保持文件打开(这是每秒写一次的日志文件).

我失败的代码如下:

procedure TFileLogger.SetLogFilename(const Value: String);
var line : String;
Created : Boolean;
begin
  if not DirectoryExists(ExtractFilePath(Value)) then //create the dir if it doesnt exist
  begin
       try
         ForceDirectories(ExtractFilePath(Value));
       except
         ErrorMessage(Value); //dont have access to the dir so flag an error
         Exit;
       end;
  end;
  if Value <> FLogFilename then //Either create or open existing
  begin
      Created := False;          
      if Assigned(FStream) then
         FreeandNil(FStream);
      if not FileExists(Value) then   //create the file and write header
      begin
           //now create a new file
           try …
Run Code Online (Sandbox Code Playgroud)

delphi logging file-locking filestream

5
推荐指数
1
解决办法
1965
查看次数

FileChannel tryLock()方法是检查锁还是只是打破它们?

我有两个进程可以查看相同的文件,并希望实现文件锁定.问题似乎是一个进程用java编写而另一个进程用C编写,并且不清楚java端如何实现低级锁定.该平台是Solaris 10.我尝试在文件上引入锁定,以防止在C进程读取文件时Java进程进行更新.我的想法是尝试从java代码中获取一次锁定10次,然后才无条件地写入文件(我假设锁定类型是一个咨询锁定).但是,java tryLock()会在第二次尝试时中断C进程的锁定并破坏读取.

这是代码,简化(Java):

    int iAttemptCnt = 0;
              FileChannel wchannel = new FileOutputStream(new File(fileName), false).getChannel();;
              FileLock flock;
    while(true){
        try{
            MyLog.log(MyLog.LVL_INFO, "attempt to lock  file");
            if( (flock = wChannel.tryLock()) == null ){
                // lock held by another program
                if(++iAttemptCnt >= 10 
                    break;                  
            }
            else{
                MyLog.log(MyLog.LVL_INFO, " file locked");
                break;
            }
        }catch(OverlappingFileLockException ofle){
            .......                     
            if(++iAttemptCnt >= 10 ){
            ...
                break;          
            }                   
        }catch(IOException ioe){
            throw new IOException("failed to lock the  file");
        }
        try{
            MyLog.log(MyLog.LVL_INFO, "File already locked, retrying in one second");
            Thread.sleep(1000);
        }catch(InterruptedException …
Run Code Online (Sandbox Code Playgroud)

java solaris file-locking filelock

5
推荐指数
1
解决办法
917
查看次数

如何通过java程序在linux/unix中锁定文件?

我需要在unix/linux OS中锁定一个文件.我用谷歌搜索并阅读java.nio.channels FilelockReentrant File Lock.但两者都适用于Windows,但不适用于unix.有没有其他方法在unix中实现锁定文件?任何示例代码都将受到高度赞赏.

谢谢,Vignesh

java linux file-locking

5
推荐指数
1
解决办法
3916
查看次数

日志文件监视器

是否可以打开文本文件并在另一个应用程序更新文件时读取内容,这样它不会导致锁定冲突?

我需要监视来自一个应用程序的日志文件,每次事件发生时由另一个应用程序更新.

我在尝试阅读之前检查文件是否正在使用,但这似乎并不适用于所有情况.

谢谢,彼得

delphi file-io file-locking

4
推荐指数
1
解决办法
2341
查看次数

有没有办法在Perl中创建一个锁定在创建点的文件?

我需要在创建时创建一个锁定读取的文件,以便在完全编写之前,可能要查找此文件的其他进程不会开始读取它.

我知道我可以创建并随后将其锁定,但我担心,这给我留下开放的竞争条件.

或者我在这里什么都不担心?如果我打开一个文件进行写入然后打开它以便用另一个进程读取,那么在写入过程关闭文件之前,读取过程是否永远不会看到EOF?

perl file-io file-locking

4
推荐指数
2
解决办法
169
查看次数

Python:打开文件而不创建锁

我正在尝试用Python创建一个脚本来备份一些文件.但是,这些文件可以随时重命名或删除.我不希望我的脚本通过锁定文件来阻止它; 在备份期间,该文件应该仍然可以随时删除.

我怎么能用Python做到这一点?而且,会发生什么?如果无法读取流,我的对象是否会变为空?

谢谢!我对Python有些新意.

python backup file-locking filestreams

4
推荐指数
2
解决办法
5081
查看次数

NFS4 共享的 Docker 卷中的文件锁支持

这是我的摘录docker-compose.yml

\n\n
volumes:\n  nfs_share:\n    driver: local\n    driver_opts:\n      type: nfs\n      o: addr=nfs_server,rw,noatime\n      device: ":/srv/nfs_share"\n
Run Code Online (Sandbox Code Playgroud)\n\n

该卷已正确安装在主机上。

\n\n

但是,在我的 docker 实例中,我无法使用文件锁。

\n\n

例子:

\n\n
# exec 3 > test_file\n# flock -x 3\nflock: 3: No locks available\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我在主机上手动挂载分区,我可以毫无问题地使用文件锁。

\n\n

另外,我发现 Docker 没有使用正确的协议版本挂载 NFS 共享:

\n\n
:/srv/nfs_share on /var/lib/docker/volumes/registry_registry/_data type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr={MYIPADDR},mountvers=3,mountproto=tcp,local_lock=none,addr={MYIPADDR})\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果我在主机上手动挂载分区,则可以正确使用 NFS4:

\n\n
nfs:/srv/nfs_share on /mnt/nfs_share type nfs4 (rw,relatime,vers=4.0,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr={MYIPADDR},local_lock=none,addr={MYIPADDR})\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试添加nolock选项,或者local_lock=all,这些选项似乎被忽略\xe2\x80\xa6 我也尝试指定该vers=4.0选项,或使用type: nfs4\xe2\x80\xa6 所有这些变体都不会改变任何内容。

\n

nfs file-locking docker docker-volume

4
推荐指数
1
解决办法
4290
查看次数