【问题标题】:Accessing Windows' special named folders in PHP fopen streams在 PHP fopen 流中访问 Windows 的特殊命名文件夹
【发布时间】:2011-03-29 10:25:33
【问题描述】:

http://en.wikipedia.org/wiki/Special_Folders

我在访问 php 的 fopen 流中的特殊文件夹时遇到问题。

例子

$fp = fopen("%USERPROFILE%/Desktop/text.txt", 'wb');
fwrite($fp, $data);
fclose($fp);

我在运行 sysinternals 进程监视器的情况下尝试此操作,以尝试查看实际发生的情况,它看起来像这样。

C:/xampp/htdocs/test/%USERPROFILE%/Desktop/text.txt  PATH NOT FOUND

显然有两件事出了问题,PHP 将路径视为相对路径,并且未评估特殊文件夹。

【问题讨论】:

    标签: php windows stream fopen special-folders


    【解决方案1】:
    $fp = fopen("{$_ENV['USERPROFILE']}\\Desktop\\text.txt", 'wb');
    

    参见手册上的$_ENVgetenv()

    正如 Johannes Rössel 所说,这仅在有限的情况下有效。您可以改用这个内部函数:

    #include<Shlobj.h>
    
    PHP_FUNCTION(win_get_desktop_folder)
    {
        char szPath[MAX_PATH];
    
        if (zend_parse_parameters_none() == FAILURE)
            RETURN_NULL();
    
        if (SUCCEEDED(SHGetSpecialFolderPathA(NULL, szPath,
            CSIDL_DESKTOP, FALSE))) {
            RETURN_STRING(szPath, 1);
        } else {
            RETURN_FALSE;
        }
    }
    

    【讨论】:

    • 它仍然有部分错误,因为不能保证桌面文件夹位于那里:-)。虽然我不知道你是否可以通过 PHP 调用 SHGetKnownFolderPath
    • @Johan Right...我猜,他需要写一个扩展。
    • ok $_env['USERPROFILE'] 有效。但是 %temp% 等价物呢? $_env['TEMP'] 和 $_env['TMP'] 等于 C:\Windows\TEMP 而 %temp% 等于 C:\Users\Admin\AppData\Local\Temp
    • @Needy 这可能是因为您在作为系统帐户运行的 Apache 进程下运行 PHP,因为每个临时目录都是另一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多