2

我有来自 Rackspace 的 PHP 库。我们将所有文件保存在一个名为“数据”的容器中。在该容器内是文件的分层目录。

我可以重命名或移动对象,没问题(包装在我自己的类中):

    $this->container->move_object_to('uploads/files/file.txt', 'data', 'uploads/files2/filecopy.txt');

但我不能对文件夹做同样的事情:

    $this->container->move_object_to('uploads/files', 'data', 'uploads/files2');

所以我想相反,我会将所有对象放在一个文件夹中并单独复制每个对象。但我只能在容器中获取对象:

    $container = $this->connection->get_container('data');
    $files = $container->list_objects();

这不起作用:

    $container = $this->connection->get_container('data/uploads');
    $files = $container->list_objects();

如何重命名文件夹?或者,将文件夹中的所有对象移动到新对象?

4

2 回答 2

3

这里的问题是容器内没有文件夹这样的东西。容器是最顶层的分组,在它之下只是一组对象。

您的对象的名称中有目录分隔符,因此可以在 URL 中以这种方式引用它们。实际上,它们只是名称中具有相似前缀的单个对象;它们实际上并未“按文件夹”分组。

我不是 PHP 程序员,但这里有一些伪代码(可能不准确):

编辑使用@magglass1 提供的功能

$old_dir = "oldir/";
$new_dir = "newdir/";
$container = $this->connection->get_container('data');
$files = $container->list_objects(0, NULL, $old_dir);
foreach ($files as $file) {
    $new_filename = substr_replace($file, $new_dir, strpos($file, $old_dir), strlen($old_dir));
    $this->container->move_object_to($file, 'data', $new_filename);
};
于 2013-04-24T15:30:07.913 回答
1

您可以通过在 list_objects() 调用中指定前缀来按伪文件夹列出对象。下面是函数的用法:

list_objects($limit=0, $marker=NULL, $prefix=NULL, $path=NULL)

所以沿着这条线的东西应该起作用:

$container = $this->connection->get_container('data');
$files = $container->list_objects(0, NULL, 'uploads/');

然后,您将遍历并复制所有返回的对象。

-标记

于 2013-04-24T15:31:05.293 回答