修改目录结构,同时重命名所有文件以表示其原始路径

时间:2011-05-14 22:46:22

标签: php windows linux zend-framework azure

我正在考虑在Microsoft Azures Blob存储上存储Zend Framework。 Azure Blob存储具有平面文件系统,其中Zend Framework具有深度嵌套的结构。

我想使用以下命名约定/方法创建一个包含所有Zend Framework文件的文件夹。

例如:Zend_Log_Writter类存储在:

library / Zend / Log / Writer.php

在新的平面输出文件夹中,文件名为:

Zend.Log.Writter.php

我将使用任何可以完成linux或Windows工作的工具。我可以编写一个可以执行此操作的PHP脚本,但我猜测那里有一块Linux Foo,可以通过一些链接命令完成我的工作。

3 个答案:

答案 0 :(得分:1)

我知道如何在python中执行此操作。这是一个例子。首先在一些虚拟目录上测试它,以确保你正确使用它。

import os
import shutil
directory = '/path/to/your/directory/'
for root, folder, files in os.walk(directory):
    for file in files:
        print(directory+'renamed/'+root.replace('/', '.')[1:]+'.'+file)
        shutil.copy(root+'/'+file, directory+'renamed/'+root.replace('/', '.')[1:]+'.'+file)

编辑我为什么使用python:我确实尝试在Linux中使用find命令和-exec选项....但更简洁,更容易理解这种方式。我猜你可以在bash shell上使用一条非常棒的线路。但是不确定尝试找出它所需的额外时间是值得的,因为这基本上只有4行相关代码。

答案 1 :(得分:1)

如果我正确地阅读了这个问题,听起来你正试图将文件系统映射到Windows Azure存储中的各个blob。您需要某种类型的中间层来将所请求的文件映射到单个blob(并且php具有非常强大的SDK,您可以使用它来访问blob)。关于blob的一个修正:它不完全是平的:URI将是https://mystorageaccount/containername/blobname。您有一个本机目录(容器),然后您可以使用Pekka提供链接的技术模拟更多级别。

但是:对我而言,这种映射听起来可能具有性能影响以及交易影响。

作为替代方案,为什么不在Windows Azure页面blob中安装NTFS格式的云端硬盘?您的驱动器最高可达1TB,可通过驱动器号访问。它是持久的(意味着在数据中心内进行三重复制),并且可以让你随后安装任何东西(例如Zend的文件目录结构)。很容易设置 - 可能有十几行代码。

Cloud Drives的一个警告:只有一位作家。在将Web应用扩展到多个实例时,您必须牢记这一点。有一些解决方法(例如每个实例有一个云驱动器),并利用缓存(例如最近投入生产的新AppFabric缓存)。

编辑:这是Maarten Balliauw的great Cloud Drive sample,演示了创建/分配/安装云端硬盘所需的步骤。

答案 2 :(得分:0)

试试这段代码。它使用了Microsoft的StorageClient库。

命名空间RenameBlobs {     课程     {

    static void Main(string[] args)
    {
        CloudStorageAccount csa = CloudStorageAccount.DevelopmentStorageAccount;
        string blobContainerName = "png1";
        string oldDelimiter = "/";
        string newDelimiter = ".";
        CloudBlobClient blobClient = csa.CreateCloudBlobClient();
        var blobContainer = blobClient.GetContainerReference(blobContainerName);
        string blobContainerUriString = blobContainer.Uri.AbsoluteUri;
        BlobRequestOptions blobRequestOptions = new BlobRequestOptions()
        {
            UseFlatBlobListing = true,
        };
        var blobsList = blobContainer.ListBlobs(blobRequestOptions);
        foreach (var blob in blobsList)
        {
            var blockBlob = (CloudBlockBlob) blob;
            var abc = blockBlob.Metadata;
            blockBlob.FetchAttributes();
            string blobName = blockBlob.Uri.AbsoluteUri;
            blobName = blobName.Replace(blobContainerUriString, string.Empty);
            if (blobName.StartsWith(oldDelimiter))
            {
                blobName = blobName.Substring(1);
            }
            if (blobName.Contains(oldDelimiter))
            {
                blobName = blobName.Replace(oldDelimiter, newDelimiter);
                string newBlobUriString = string.Format("{0}/{1}", blobContainerUriString, blobName);
                var cloudBlob = blobContainer.GetBlobReference(newBlobUriString);
                cloudBlob.CopyFromBlob(blockBlob);
            }
        }
    }
}

}

如果您对此代码有任何疑问,请与我们联系。

希望这有帮助。

由于