Лесть структура каталогов при переименовании всех файлов, чтобы представить их исходные пути - PullRequest
1 голос
/ 15 мая 2011

Я пытаюсь сохранить Zend Framework в хранилище BLOB-объектов Microsoft Azures. Хранилище Azure Blob имеет плоскую файловую систему, в которой Zend Framework имеет глубоко вложенную структуру.

Я хочу создать папку, содержащую все файлы Zend Framework, используя следующее соглашение / метод именования.

Например: класс Zend_Log_Writter хранится в:

библиотека / Zend / Log / Writer.php

В новой папке вывода плоских файлов файл будет иметь имя:

Zend.Log.Writter.php

Я буду использовать любой инструмент, который выполнит работу Linux или Windows. Я мог бы написать PHP-скрипт, который бы делал это, но я предполагаю, что есть часть Linux Foo, которая могла бы выполнить то, что мне нужно, с помощью нескольких связанных команд.

Ответы [ 3 ]

1 голос
/ 15 мая 2011

Если я правильно читаю этот вопрос, похоже, вы пытаетесь сопоставить файловую систему с отдельными BLOB-объектами в хранилище Windows Azure.Вам потребуется какой-то промежуточный уровень для сопоставления запрошенных файлов с отдельными BLOB-объектами (а php имеет очень надежный SDK , который вы можете использовать для доступа к BLOB-объектам).Одно исправление в отношении больших двоичных объектов: оно не совсем плоское: URI будет https://mystorageaccount/containername/blobname. У вас есть один собственный каталог (контейнер), и вы можете затем имитировать дальнейшие уровни, используя технику, с которой Пекка предоставила ссылку.* Однако: для меня это отображение звучит так, как будто оно может влиять как на производительность, так и на транзакции.

В качестве альтернативы, почему бы не смонтировать облачный диск в формате NTFS в блоб страницы Windows Azure?Ваш диск может быть до 1 ТБ, доступный через букву диска.Он долговечен (имеется в виду тройная репликация внутри центра обработки данных) и позволит вам затем установить в него практически все, что угодно (например, структуру файловых каталогов для Zend).Довольно прост в настройке - возможно, дюжина строк кода.

Единственное предостережение для Cloud Drives: только один писатель.Вы должны иметь это в виду при масштабировании вашего веб-приложения на несколько экземпляров.Существуют обходные пути (например, наличие одного облачного диска на экземпляр) и использование преимуществ кэширования (например, новый кэш AppFabric, недавно запущенный в эксплуатацию).

РЕДАКТИРОВАТЬ: Вот отличный пример Cloud Drive от Maarten Balliauw, демонстрирующий шаги, необходимые для создания / размещения / монтирования Cloud Drive.

1 голос
/ 15 мая 2011

Я знаю, как это сделать на 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: Сначала я попытался использовать команду find и опцию -exec в Linux .... но гораздо чище и проще для понимания таким образом. Я предполагаю, что вы могли бы пойти с одной удивительной строкой в ​​оболочке bash. Однако не уверен, что дополнительное время, необходимое для того, чтобы попытаться выяснить это, стоит того, поскольку это всего лишь 4 строки соответствующего кода.

0 голосов
/ 15 мая 2011

Попробуйте этот код.Он использует библиотеку StorageClient от Microsoft.

пространство имен RenameBlobs {class Program {

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

}

Дайте мне знать, если у вас есть какие-либо вопросы по поводу этого кода.

Надеюсь, это поможет.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...