file_get_contents读取路径中包含中文文件名问题

wsimplej 2012-05-17 10:30:03
$data = file_get_contents($file_names);中$file_names中指向的路径中包含中文文件名称就报错[function.file-get-contents]: failed to open stream: No such file or directory不用中文的文件名就可以,纠结啊!不能重命名文件的
...全文
873 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2012-05-17
  • 打赏
  • 举报
回复
关键在于你的 $file_names 中的文件名的编码要与操作系统的语言编码一致
wsimplej 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

$file_names = "D:/我的文档/Youku Files\download/[LIVE]汪峰.-.春天里.flv";
$s = file_get_contents($file_names);
echo strlen($s);//7216760

不存在你说的问题,当然你要正确的书写文件名(包括语言编码)
[/Quote]
$data = file_get_contents($file_names);
$a = "/charset(\s*)=(\s*)[\w|-]{0,20}/";
preg_match($a, $data, $match);
$data2 = str_replace($match[0],"charset=gb2312",$data);
file_put_contents($file_names,$data2);
echo "<script type='text/javascript'>location.href='$file_names';</script>";完整的代码是这样的,下面的js已经把文件打开了,这证明路径应该是对的!我读取文件的目的其实只想改一下里面的编码,可是文件名称用中文的就没有被正则替换,英文的就成功替换了!
xuzuning 2012-05-17
  • 打赏
  • 举报
回复
$file_names = "D:/我的文档/Youku Files\download/[LIVE]汪峰.-.春天里.flv";
$s = file_get_contents($file_names);
echo strlen($s);//7216760

不存在你说的问题,当然你要正确的书写文件名(包括语言编码)
wsimplej 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

你的文件名是用目录函数读取的,不需要做编码转换
为什么不用 glob 函数呢?
scandir 读取的文件名不含路径,而 glob 读取的分建明是含路径的。可以免去组装文件名的麻烦
读取后缀可用 pathinfo($filename, PATHINFO_EXTENSION) 简单且高效

另外请告知你的php版本号,低版本的有可能中文文件名无效。确认一下
[/Quote]
php版本是PHP5.3.10我不编码转换出来的名称就都是乱码了!的确pathinfo好使!
xuzuning 2012-05-17
  • 打赏
  • 举报
回复
你的文件名是用目录函数读取的,不需要做编码转换
为什么不用 glob 函数呢?
scandir 读取的文件名不含路径,而 glob 读取的文件名是含路径的。可以免去组装文件名的麻烦
读取后缀可用 pathinfo($filename, PATHINFO_EXTENSION) 简单且高效

另外请告知你的php版本号,低版本的有可能中文文件名无效。确认一下
chanya 2012-05-17
  • 打赏
  • 举报
回复
1.是不是文件名中有空格存在。
2.再就是编码问题,将文件目录打印出来看检查一下。
wsimplej 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

关键在于你的 $file_names 中的文件名的编码要与操作系统的语言编码一致
[/Quote]完整代码是这样的
	if(is_dir($file_dir)){
$file = scandir($file_dir,-1);
if(!empty($file)){
//$dirName ="2b";
foreach($file as $key => $value){
if($value == '.' || $value == '..'){
continue;
}
if(is_dir($file_dir."/".$value)){
$value = mb_convert_encoding($value,"UTF-8","GBK");
$dirName = substr($value,0,strrpos($value,'.'));
}
if(!is_dir($file_dir."/".$value)){
$a = substr($value,strrpos($value,'.'));
if('.htm' == $a){
$dirName = mb_convert_encoding($dirName,"GBK","UTF-8");
if(!empty($dirName)){
rename($file_dir."/".$value,$file_dir."/".$dirName.".htm");
}else{
$file_names = $value;
}
}
}
}
$count = substr_count($dirName,'.');
if(!empty($dirName) && $count == 0){
$dirName = mb_convert_encoding($file_dir."/".$dirName,"UTF-8","GBK");
$file_names = $dirName.".htm";
}else{
$file_names = $file_dir."/".$file_names;
}
$data = file_get_contents($file_names);
$a = "/charset(\s*)=(\s*)[\w|-]{0,20}/";
preg_match($a, $data, $match);
$data2 = str_replace($match[0],"charset=gb2312",$data);
file_put_contents($file_names,$data2);
echo "<script type='text/javascript'>location.href='$file_names';</script>";
}
}
我已经改过$file_names的编码了
wsimplej 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

iconv("utf-8", "gbk",file_get_contents('url'));
先换成操作系统的编码试试能打开文件内容吗?你这主要是中文路径打不开文件,获取不到内容所以无法替换吧
[/Quote]对的!中文名称的时候,strlen($data)没有内容,英文就可以了!
  • 打赏
  • 举报
回复
iconv("utf-8", "gbk",file_get_contents('url'));
先换成操作系统的编码试试能打开文件内容吗?你这主要是中文路径打不开文件,获取不到内容所以无法替换吧
  • 打赏
  • 举报
回复
中文的时候看下echo strlen($data);有没有取到内容
qq120848369 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

关键在于你的 $file_names 中的文件名的编码要与操作系统的语言编码一致
[/Quote]

++

这是关键。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧