我想对一个文件进行读-修改-写,同时我有一个独占锁。显然,我可以使用flock()并执行fopen、flock、fread、fwrite、flock、fclose序列,但是如果我可以使用file_get_contents和file_put_contents,我的代码看起来会更整洁。然而,我需要锁定这两个进程,我想知道是否可以使用flock“以某种方式”做到这一点。当然,危险在于,我会写一些看起来有效但实际上不能锁定任何东西的东西:-)
正如@Jonathan所说,您可以将LOCK_EX标志与file_put_contents一起使用,但是对于file_get_contents,您可以构建自己的自定义函数,然后在代码中使用它。下面的代码可以作为您的起点:
function fget_contents($path,$operation=LOCK_EX|LOCK_NB,&$wouldblock=0,$use_include_path = false ,$context=NULL ,$offset = 0 ,$maxlen=null){
if(!file_exists($path)||!is_readable($path)){
trigger_error("fget_contents($path): failed to open stream: No such file or directory in",E_USER_WARNING);
return false;
}
if($maxlen<0){
trigger_error("fget_contents(): length must be greater than or equal to zero",E_USER_WARNING);
return false;
}
$maxlen=is_null($maxlen)?filesize($path):$maxlen;
$context=!is_resource($context)?NULL:$context;
$use_include_path=($use_include_path!==false&&$use_include_path!==FILE_USE_INCLUDE_PATH)?false:$use_include_path;
if(is_resource($context))
$resource=fopen($path,'r',(bool)$use_include_path,$context);
else
$resource=fopen($path,'r',(bool)$use_include_path);
$operation=($operation!==LOCK_EX|LOCK_NB&&$operation!==LOCK_SH|LOCK_NB&&$operation!==LOCK_EX&&$operation!==LOCK_SH)?LOCK_EX|LOCK_NB:$operation;
if(!flock($resource,$operation,$wouldblock)){
trigger_error("fget_contents(): the file can't be locked",E_USER_WARNING);
return false;
}
if(-1===fseek($resource,$offset)){
trigger_error("fget_contents(): can't move to offset $offset.The stream doesn't support fseek ",E_USER_WARNING);
return false;
}
$contents=fread($resource,$maxlen);
flock($resource, LOCK_UN);
fclose($resource);
return $contents;
}
我只是将flock
的参数与file_get_contents
的参数组合在一起,所以您只需要阅读关于这两个函数的内容就可以理解代码。但是,如果您不需要高级用法,您可以这样做
$variable=fget_contents($yourpathhere);
我想这句台词和:
$variable=file_get_contents($yourpathhere);
我通过使用这段代码从php中的html文件中回显tah。 但我得到错误后运行我的代码在本地。 错误: 致命错误:未捕获错误:调用C:\xampp\htdocs\2\index中未定义的函数文件\u get\u html()。php:2堆栈跟踪:#0{main}在C:\xampp\htdocs\2\index中抛出。php在线2 php代码: 这是更改后的错误: 警告:file_get_conten
主要内容:C++ ostream::put()成员方法,C++ istream::get()成员方法在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。 C++ ostream::put()成员方法 通过《 C++ cout.put()》一节的学习,读者掌握了如何通过执行 cout.put() 方法向屏幕输出单个字符。我们知道,fstream 和 ofstream 类继承自 ostream 类,因
我正在尝试上传图片到imgur,我可以上传大部分图片,但有些图片我无法上传,我不知道为什么。这给了我警告。 警告:文件\获取\内容():文件名在C:\wamp64\www\social\my-account.php中不能为空 如果代码有问题,我如何才能上传相同文件类型的其他图像。 从我观察到的所有未能上传的图片来看,文件大小相当大(约2MB至4MB)。 如果这是因为大小,我怎么能解决这个问题。 p
我想使用maven安装JDBC连接器。 我有以下几点: mvn install:install-file -DgroupId=mysql -达蒂法特 Id=mysql-connnector-java -Dversion=5.1.6 -Dpackaging=jar -Dfile= -DgenerationPom=真 我想我所需要的就是我放在=Dfile=另一边的东西? 我也有段时间没用maven了,
问题内容: 我正在开发一个JavaScript应用程序,该应用程序可以从Web服务器(通过http)运行,也可以从文件系统(在file:// URL上)运行。 作为此代码的一部分,我需要使用XMLHttpRequest在与页面相同的目录中以及页面的子目录中加载文件。 在Web服务器上执行时,此代码可以正常工作(“通过”),而在文件系统中运行时,此代码在Internet Explorer 8中则无法
问题内容: 我试图了解我正在制作的一个小程序的PrintWriter,而且我似乎无法让Java来制作文件然后在上面写。当我执行下面的程序时,它在第9行显示Filenotfoundexeption错误。它也无法在我指定的目录中创建文件。我对此并不陌生,因此请尝试使答案保持简单。我正在使用Eclipse。 问题答案: 如果该目录不存在,则需要创建它。Java不会自己创建它,因为该类只是到一个实体的链接