0

我是 SPL 和 recursiveIterator 的新手……你能帮帮我吗?

我想要达到的目标:

我想在文件夹树中找到一个文件,我想获取它的路径。

我的文件夹树可能看起来像这样:

./ressources
./ressources/Images
./ressources/Images/Image01
./ressources/Images/Image02
./resources/Images/ImagesSub/Image03
./ressources/Docs
./ressources/Docs/Doc01

等等...

我通过 sql 查询获得了我的文件的名称(警告:它们从来没有扩展名)。现在,我想通过在“./ressources”文件夹上执行递归迭代器来查找文件的位置。

然后,当我找到该文件时,我想返回整个链接“./ressources/Folder/File”。

我已经阅读了Gordon 的解决方案,但它不起作用,我只尝试回显某些内容,但没有显示任何内容。

这是我的代码:

$doc_id = $bean->id;
$query = "SELECT a.document_revision_id  FROM  documents as a, document_revisions as b ";
$query .= "WHERE a.document_revision_id = b.id AND a.id = '" . $doc_id . "' LIMIT 1";
$results = $bean->db->query($query, true);
$row = $bean->db->fetchByAssoc($results);

$file_id = $row['document_revision_id'];
$ressources = './ressources/';
$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($ressources, RecursiveDirectoryIterator::KEY_AS_FILENAME), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iter as $entry) {
    if ($entry->getFilename() === $file_id){
        echo '<script> alert('.$entry->getFilepath().');</script>';
    }
}

(我知道在回声中发出警报是胡说八道,但是用糖来显示一些东西是相当困难

我正在尝试在 SugarCrm CE 6.5.2 logic_hook 中执行此操作,并且它在 archlinux 上运行。我的 PHP 版本是 5.4.6

真的很紧急,如果你能帮助我,我会很高兴的!!

提前感谢!

2009 年 12 月 10 日下午 2 点开始编辑:我的糖项目是什么以及为什么我无法从数据库中获取路径名

我在 Documents 模块中创建了一个名为 folder_name_c 的自定义字段。您使用要上传文档的文件夹的名称(在资源下)填充它。

我想允许用户在我编辑文档时将上传的文件从其旧文件夹移动到新文件夹。

编辑文档时,我做了一个 after_retrieve 挂钩以允许 logic_hook 在编辑时工作(之前,它只是为编辑视图完成)

所以,如果我得到 $bean->folder_name_c,它会获取该字段的内容。如果我尝试使用 sql,它只会在我单击“保存”后才会选择 folder_name_c。

所以,我没有任何线索可以让我的旧文件夹名称创建一个

$old_link = '.ressources/'.$old_folder.'/'.$file_id;

我只能创建

$new_link = '.ressources/'.$bean->folder_name_c.'/'.$file_id;

所以,经过很长一段时间,我发现我可以浏览我的 ressources 文件夹和我的子文件夹来找到名为 $file_id 的文件,然后创建 $old_link

仅供参考,通过在糖工作室下创建一个新的自定义字段,我获得了很多时间。我不想通过添加 custom_code 调用数据库或其他方式来度过我的生活。这是紧急的,递归迭代器似乎简单快捷。

4

2 回答 2

1

没有诸如getFilepathfor 之类的方法(Recursive)DirectoryIterator,只使用$entry它自己,当在字符串上下文中使用时,它被强制转换为这样的一个(à la __toString):

$file_id = 'test';
$ressources = './ressources/';

// [...]

echo '<script>alert('.$entry.');</script>'; // is casted to a string which contains the full path

// results in alerting ./resources/SubFolder/test

我用相同的结构测试了它,没有扩展。

于 2012-10-09T13:55:14.963 回答
0

所以,我发现了如何使用递归迭代器来解决我的问题!这是我的代码:

$ressources = './ressources/';
$directoryIter = new RecursiveDirectoryIterator($ressources);
$iter = new RecursiveIteratorIterator($directoryIter, RecursiveIteratorIterator::SELF_FIRST);
$old_path = '';
$new_path = $ressources.$bean->folder_name_c.'/'.$file_id;
chmod($new_path,0777);

foreach ($iter as $entry) {

    if (!$directoryIter->isDot()) {

        if ($entry->getFileName() == $file_id) {
            $old_path = $entry->getPathName();
            chmod($old_path, 0777);
            copy($old_path,$new_path);

         }
    }
}

所以我成功获得了我的文件的原始路径!:)

一如既往有一个问题

我想将我的文件从 $old_path 剪切并粘贴到 $new_path (如您在我的代码中所见)。这里的副本效果很好,但我不知道我必须在哪里取消链接()旧路径..如果有人知道......(如果我在错误的行中写了副本,请告诉我!:D)

于 2012-10-09T14:59:28.267 回答