我有来自Rackspace的PHP库。我们将所有文件保存在名为“data”的Container中。在该容器内是文件的分层目录。
我可以重命名或移动一个对象,没问题(包裹在我自己的类中):
$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();
如何重命名文件夹?或者,将文件夹中的所有对象移动到新文件夹中?
答案 0 :(得分: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);
};
答案 1 :(得分: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/');
然后循环并复制所有返回的对象。
-Mark