【问题标题】:PHP file_exists and unlink doesn't work ("No such file or directory")PHP file_exists 和 unlink 不起作用(“没有这样的文件或目录”)
【发布时间】:2013-08-29 14:17:47
【问题描述】:
$path = "F:/www/__DADOS__/__SESSAO/__9987f2bfdfb80bce8fd72402887bb2c50a433ae0__E6nDSMnD7TCY5#47$BNCx0e#47$r#47$ByZJvcyMIazXSYWBWBXN5lgdZOd3Ps#47$ROrVSPl7QVQaCqfa2WezCauk#47$LVFyhgw==.meudominio.com.sessid"

file_put_contents($path, $texto);

unlink($path);

在上面的代码中,我在 unlink($ path); 中收到警告 No such file or directory 并且文件没有被删除,我也尝试使用 file_exists查看之前的文件,返回为:false

file_put_contents 正确创建文件(已检查),即使内容正确。我可以通过file_get_contents访问该文件,但及时删除或验证存在失败。有人知道吗?

$path 的总大小为241

这个问题似乎更微妙。文件名由 base64_encode 组成,文件名经常更改,每次执行大约有 10 个文件。我可以删除一些,而另一些则不能,发出上述警告。难道是任何字符都不是unlink() 不接受的吗?我有一些转义保留字符,例如 /\?%*:|"http://en.wikipedia.org/wiki/Filename

我尝试使用哈希(sha1、sha256 和 sha512)而不是 base64_encode,但错误仍然存​​在。

【问题讨论】:

  • 你应该在你的字符串值周围使用双引号或单引号$path$path = "F:/www/__DADOS__/__SESSAO/__9987f2bfdfb80bce8fd72402887bb2c50a433ae0__E6nDSMnD7TCY5#47$BNCx0e#47$r#47$ByZJvcyMIazXSYWBWBXN5lgdZOd3Ps#47$ROrVSPl7QVQaCqfa2WezCauk#47$LVFyhgw==.meudominio.com.sessid"但是你确定你的文件名有那么长???,并且包含#???跨度>
  • 见谅,她已经在引号里了,只是忘了放这里,如果我们没有错误的话,这行不是这样的。谢谢你。有什么建议吗?
  • 如果说你忘记了 " 周围的 $path 值,我猜你在这个 var 定义的末尾也有 ; 但是你忘了写在这里,然后您的代码没有任何问题,并且您正在使用它读取文件的 var 相同;你应该可以用它来删除文件“unlink()
  • 我每次运行大约有 10 个文件,它适用于某些文件,但不适用于其他文件。我推断这是一个问题,但不确定。

标签: php warnings file-exists unlink


【解决方案1】:

由于您在" " 内部使用/,所以/ char 不是普通字符,它通常用于转义特殊字符(wen 用在双引号内),但如果您想忽略字符串值定义中的任何/,只需使用// 所以第一个正斜杠将转义第二个斜杠,PHP 会将它们视为一个斜杠 但不要忘记转义美元符号 ($) 和所有特殊字符或将引号从 " 更改为 ',然后您不必更改字符串值中的任何内容:

<?php
$path = 'F:/www/__DADOS__/__SESSAO/__9987f2bfdfb80bce8fd72402887bb2c50a433ae0__E6nDSMnD7TCY5#47$BNCx0e#47$r#47$ByZJvcyMIazXSYWBWBXN5lgdZOd3Ps#47$ROrVSPl7QVQaCqfa2WezCauk#47$LVFyhgw==.meudominio.com.sessid';
//OR
$path = "F://www//__DADOS__//__SESSAO//__9987f2bfdfb80bce8fd72402887bb2c50a433ae0__E6nDSMnD7TCY5#47/$BNCx0e#47/$r#47/$ByZJvcyMIazXSYWBWBXN5lgdZOd3Ps#47/$ROrVSPl7QVQaCqfa2WezCauk#47/$LVFyhgw==.meudominio.com.sessid";

echo file_exists($path);//will return 1
//unlink($path);
?>

【讨论】:

  • 您是否使用了' 而不是" 并且问题仍然存在?
  • 是的,我尝试使用 ' 代替 ",并且还使用了 // 和 "。我对 \ 和 \\ 所做的相同,我在 Windows 环境(生产)中。
  • 实际上,如果您使用' 而不是",则无需执行任何其他操作,只需通过浏览驱动器中的文件位置F:\ 来确保该文件确实存在如果它在那里,那么您的问题与此 sn-p 无关
  • 我希望是这样,它会很容易解决,但是当我复制路径并粘贴到 Windows 资源管理器中时,Windows 会找到并打开该文件。当我使用 file_get_contents 时,它会读取文件。这就是为什么我觉得它很奇怪。因为 unlink() 和 file_exists() 不起作用?
  • 好的,你可以试试这个:$path = 'F:\www\__DADOS__\__SESSAO\__9987f2bfdfb80bce8fd72402887bb2c50a433ae0__E6nDSMnD7TCY5#47$BNCx0e#47$r#47$ByZJvcyMIazXSYWBWBXN5lgdZOd3Ps#47$ROrVSPl7QVQaCqfa2WezCauk#47$LVFyhgw==.meudominio.com.sessid';
【解决方案2】:

试试

$path ="F:/www/__DADOS__/__SESSAO/__9987f2bfdfb80bce8fd72402887bb2c50a433ae0__E6nDSMnD7TCY5#47$BNCx0e#47$r#47$ByZJvcyMIazXSYWBWBXN5lgdZOd3Ps#47$ROrVSPl7QVQaCqfa2WezCauk#47$LVFyhgw==.meudominio.com.sessid"

【讨论】:

  • 见谅,她已经在引号里了,只是忘了放在这里,如果我们没有错误的话,这行不是这样的。谢谢你。有什么建议吗?
  • 我使用 base64_encode,并根据 wikipedia.org 进行适当的替换。
猜你喜欢
  • 2018-05-05
  • 2013-01-02
  • 2023-04-07
  • 1970-01-01
  • 2016-01-29
  • 2013-01-16
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多