php&;递归迭代器:查找特定文件及其路径

php&;递归迭代器:查找特定文件及其路径,php,file,recursion,iterator,sugarcrm,Php,File,Recursion,Iterator,Sugarcrm,我是SPL和递归迭代器的新手。。。你能帮我吗 我想要实现的目标: 我想在文件夹树中找到一个文件,并获取其路径 我的文件夹树可能如下所示: ./ressources ./ressources/Images ./ressources/Images/Image01 ./ressources/Images/Image02 ./resources/Images/ImagesSub/Image03 ./ressources/Docs ./ressources/Docs/Doc01 等等 我使用sql查询获

我是SPL和递归迭代器的新手。。。你能帮我吗

我想要实现的目标:

我想在文件夹树中找到一个文件,并获取其路径

我的文件夹树可能如下所示:

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

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

然后,当我找到文件后,我想返回整个链接“/resources/Folder/file”

我读过,但没用,我只想回应一些东西,但没有显示任何东西

这是我的密码:

$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>';
    }
}
$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);

         }
    }
}
我只能创建

$new_link = '.ressources/'.$bean->folder_name_c.'/'.$file_id;
因此,经过很长时间,我发现我可以浏览我的Resources文件夹和子文件夹,找到名为$file\u id的文件,然后创建$old\u链接

仅供参考,通过在sugar的studio下创建一个新的自定义字段,我获得了很多时间。
我不想在添加自定义代码调用数据库或其他方面浪费时间。这很紧急,递归迭代器似乎简单而快速。

对于
(递归)DirectoryIterator
,没有像
getFilepath
这样的方法,只需使用
$entry
本身,当在字符串上下文中使用时,它被强制转换为这样的方法(a la):

$file_id='test';
$resources='./resources/';
// [...]
回显“警报('.$entry.');”;//被强制转换为包含完整路径的字符串
//导致警报。/resources/子文件夹/测试

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

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

$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>';
    }
}
$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)

为什么不将文件的完整路径存储在数据库中?@HorusKol我确实编辑了我的问题,添加了一些关于项目的信息。所以我真的想通过递归迭代器来实现。如果你有什么不对劲的线索,我会非常高兴地接受:)对不起,我真的不明白问题的实质。你能把你的问题简化到重要的部分吗?正如我首先说的:“我想在文件夹树中找到一个文件,我想获得它的路径。”我有文件名(但没有扩展名,所以我不能搜索“.jpg”(例如)),所以要做到这一点,我需要递归函数或递归迭代器(这似乎更适合编写代码)谢谢@dan lee,在阅读您的评论之前我已经找到了:)我将回答我自己的问题,给出代码。。但是也许你可以帮我复制/取消链接文件..使用它(因为移动和重命名没什么区别)。非常感谢@dan lee!嗯,像往常一样,糖给我带来了一些麻烦…:我替换了
copy($old\u path,$new\u path)带有
重命名($old\u path,$new\u path)而且,当我保存一个新文档(比如Doc01),然后对它进行几次编辑时,它工作得很好。但是sugar会将最后一个文件夹名称(比如Folder05)保留在一些内存中,当我想上传一个新文档(称为Image01)时,即使我给另一个文件夹名称,比如FolderMg,它也会将我的新文档重命名为Folder05。。我不知道如何修复它。。。