读取网络驱动器上的文件
Posted
技术标签:
【中文标题】读取网络驱动器上的文件【英文标题】:Read file on a network drive 【发布时间】:2012-12-31 07:40:12 【问题描述】:我在 Windows 服务器上运行 Xampp; Apache 使用本地帐户作为服务运行。 在此服务器上,网络共享以 X: 形式挂载,带有特定凭据。
我想访问位于 X: 上的文件并运行以下代码
<?php
echo shell_exec("whoami");
fopen('X:\\text.txt',"r");
?>
得到
theservername\thelocaluser
Warning: fopen(X:\text.txt) [function.fopen]: failed to open stream: No such file or directory
我尝试运行 Apache,不是作为服务,而是直接通过启动 httpd.exe ... 并且代码有效。
我看不出是什么导致了服务和应用程序之间的差异以及如何使其工作。
【问题讨论】:
Windows 网络驱动程序是每个用户的。除非您已将 X: 驱动器映射到运行 xampp 的帐户下,否则它将不是可用驱动器。 您好,谢谢您的回答。我以运行 Xampp 但挂载 x: 的用户身份登录 Windows。 【参考方案1】:您无法使用驱动器号执行此操作,因为网络映射驱动器仅供单个用户使用,因此不能由服务使用(即使您要为该用户安装它)。
您可以直接使用 UNC 路径,例如:
fopen('\\\\server\\share\\text.txt', 'r');
但是请注意,PHP 对 UNC 路径的文件系统访问存在一些问题。一个例子是bug I filed for imagettftext,但file_exists
和is_writeable
也存在问题。我没有报告后者,因为正如您从我与 imagettftext
的长期突出的错误中看到的那样,这有什么意义。
【讨论】:
您好,谢谢您的回答。当我使用这种语法时,我得到“无法打开流:无效参数”。当我使用 scandir() 时,我得到“登录失败:未知用户名或密码错误。(代码:1326)”。我想,正如你所说,服务不能使用现有的凭据。 @user1985014 它可以访问它,但是您必须配置服务以使用正确的帐户。我已经多年没有在 Windows 上使用 Apache 了,但是 IIS 很容易通过每个应用程序池做到这一点。 所以如果我不能以有权访问共享的用户身份运行 Apache,我会被卡住吗? @user1985014 正确。但是您没有理由不能更改 Apache 服务的用户,或添加新用户来访问共享。【参考方案2】:对于网络共享,您应该使用 UNC 名称:“//server/share/dir/file.ext”
如果您使用 IP 或主机名,它应该可以正常工作:
$isFolder = is_dir("\\\\NAS\\Main Disk");
var_dump($isFolder); //TRUE
$isFolder = is_dir("//NAS/Main Disk");
var_dump($isFolder); //TRUE
$isFolder = is_dir("N:/Main Disk");
var_dump($isFolder); //FALSE
【讨论】:
对我来说,在 PHP 7.2 和 Win10 (NTFS) 上,以上 3 个示例均无效 @userfuser 没关系,事情可能会在 8 年内发生变化,当您找到解决方案时,您应该在 Win10 上发布答案以帮助其他使用 PHP 7.2 的人 当然,这就是我首先发布它的原因 - 以便某些人(对他们有用的人)会更快意识到 PHP 或 Win 中的某些内容实际上发生了变化,并且它不适用于他们。以上是关于读取网络驱动器上的文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 和 IIS 7 访问映射网络驱动器中的文件
应该如何修改从网络驱动器读取 5G 日志文件的 Scala 脚本以读取最后 x 行(如 Unix 中的“tail”)?