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

时间:2012-10-09 10:25:19

标签: php file recursion iterator sugarcrm

我是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's solution但它不起作用,我只是想回应一些东西,但没有显示任何内容。

这是我的代码:

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

(我知道对一个回声做一个警告是bull,*,但是糖很难显示出来 的规格

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

这真的很紧急,所以如果你能帮助我,我真的很开心!!

先谢谢!

编辑自12/10/09下午2点: 什么是我的糖项目以及为什么我无法从我的数据库中获取路径名

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

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

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

所以,如果我得到$ bean-&gt; folder_name_c,它会获取该字段的内容。如果我尝试sql,它将在我点击“保存”后选择folder_name_c。

所以,我没有任何线索让我的旧folder_name创建

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

我只能创建

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

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

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

2 个答案:

答案 0 :(得分:1)

getFilepath没有(Recursive)DirectoryIterator之类的方法,只需使用$entry本身,当在字符串上下文中使用时,它会被转换为这样的方法(à__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

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

答案 1 :(得分: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 (正如您在我的代码中看到的那样)。这里的副本运行良好,但我不知道我必须取消链接()old_path ...如果有人知道... (如果我把副本写错了,请告诉我!:D)