8

ListBlobs()呼び出しの結果を反復しようとすると、「指定されたリソースが存在しません」という例外が発生します。直接アクセスするとblob属性を取得できますが、サブディレクトリ内のすべてのblobのリストを取得しようとしています。

問題がどこにあるかを正確に確認するために、この小さなテストを作成しました。ここにテストドライバーと2つの方法があります。最初のメソッド「GetBlockBlobDateTime」は正常に実行され、既存のBLOBの日時を返します。2番目のメソッド「GetBlobDirFiles」は同じ入力を使用し、でblobItemsを反復しようとすると、例外をスローします。

foreach (IListBlobItem blobItem in blobItems)

両方の方法で同じデータが使用されることに注意してください。私は何が欠けていますか?

    public static void DoTest(string baseURL, string container, string directory, string fileName)
    {
        DateTime t = GetBlockBlobDateTime( baseURL,  container,  directory,  fileName);
        List<string> fileList = GetBlobDirFiles( baseURL,  container,  directory);
    }

    public static DateTime GetBlockBlobDateTime(string baseURL, string container, string directory, string fileName)
    {
        CloudBlobClient blobClient = new CloudBlobClient(baseURL);
        CloudBlobDirectory blobDir = blobClient.GetBlobDirectoryReference(container);
        CloudBlobDirectory subDirectory = blobDir.GetSubdirectory(directory);
        CloudBlockBlob cloudBlockBlob = subDirectory.GetBlockBlobReference(fileName);
        cloudBlockBlob.FetchAttributes();
        DateTime cloudTimeStampUTC = cloudBlockBlob.Properties.LastModifiedUtc;
        return cloudTimeStampUTC;
    }

    public static List<string> GetBlobDirFiles(string baseURL, string container, string directory)
    {
        CloudBlobClient blobClient = new CloudBlobClient(baseURL);
        CloudBlobDirectory blobDir = blobClient.GetBlobDirectoryReference(container);
        CloudBlobDirectory subDirectory = blobDir.GetSubdirectory(directory);
        IEnumerable<IListBlobItem> blobItems = subDirectory.ListBlobs();

        List<string> fileList = new List<string>();
        foreach (IListBlobItem blobItem in blobItems)
        {
            fileList.Add(blobItem.Uri.ToString());
        }
        return fileList;
    }
4

1 に答える 1

13

OK, I figured it out:

Apparently, you don't need permissions to get file attributes, but you do to list files in the directory.

    CloudBlobClient blobClient = new CloudBlobClient(baseURL);

works when you are going to fetch attributes like this:

    cloudBlockBlob.FetchAttributes();

But you need to provide credentials like this:

    CloudBlobClient blobClient = 
                    new CloudBlobClient(baseURL, 
                    new StorageCredentialsAccountAndKey(myAccount, myKey));

when you are going to list the blobs like this:

        var blobList = subDirectory.ListBlobs();
        foreach (var blobInfo in blobList)
于 2011-06-26T15:30:58.437 に答える