我可以使用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 …
我想我错过了一些东西,但我无法理解文件锁如何在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) 我是PHP的新手.据我所知,flock()当两个用户访问将内容添加到可锁定文件的相同php文件时,我可以使用锁定文件并避免竞争条件.
但是,如果php进程崩溃会发生什么?等待可锁定文件的下一个用户会发生什么?如果服务器崩溃(某人拔插头)会发生什么?锁是否自动释放?重启服务器后文件是否会保持锁定状态?
为了简化,PHP是否确保正确处理这些危急情况(即未明确释放的锁定)?如果没有,应该如何处理这些情况?如何从这些中恢复?
我试图使用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) 我有两个进程可以查看相同的文件,并希望实现文件锁定.问题似乎是一个进程用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) 我需要在unix/linux OS中锁定一个文件.我用谷歌搜索并阅读java.nio.channels Filelock和Reentrant File Lock.但两者都适用于Windows,但不适用于unix.有没有其他方法在unix中实现锁定文件?任何示例代码都将受到高度赞赏.
谢谢,Vignesh
是否可以打开文本文件并在另一个应用程序更新文件时读取内容,这样它不会导致锁定冲突?
我需要监视来自一个应用程序的日志文件,每次事件发生时由另一个应用程序更新.
我在尝试阅读之前检查文件是否正在使用,但这似乎并不适用于所有情况.
谢谢,彼得
我需要在创建时创建一个锁定读取的文件,以便在完全编写之前,可能要查找此文件的其他进程不会开始读取它.
我知道我可以创建并随后将其锁定,但我担心,这给我留下开放的竞争条件.
或者我在这里什么都不担心?如果我打开一个文件进行写入然后打开它以便用另一个进程读取,那么在写入过程关闭文件之前,读取过程是否永远不会看到EOF?
我正在尝试用Python创建一个脚本来备份一些文件.但是,这些文件可以随时重命名或删除.我不希望我的脚本通过锁定文件来阻止它; 在备份期间,该文件应该仍然可以随时删除.
我怎么能用Python做到这一点?而且,会发生什么?如果无法读取流,我的对象是否会变为空?
谢谢!我对Python有些新意.
这是我的摘录docker-compose.yml:
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"\nRun 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\nRun 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})\nRun Code Online (Sandbox Code Playgroud)\n\n但是,如果我在主机上手动挂载分区,则可以正确使用 NFS4:
\n\nnfs:/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})\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试添加nolock选项,或者local_lock=all,这些选项似乎被忽略\xe2\x80\xa6 我也尝试指定该vers=4.0选项,或使用type: nfs4\xe2\x80\xa6 所有这些变体都不会改变任何内容。