Используя GetObject, возвращаемый поток памяти равен нулю, а GetObjectSaveToFile возвращает правильный файл

Rackspace .NET cloudifles API, метод GetObjectSaveToFile получает файл и сохраняет его должным образом в указанном месте, но при использовании метода GetObject, если я сохраняю возвращенный поток памяти, файл заполняется кучей нулей.

var cloudFilesProvider = new CloudFilesProvider(cloudIdentity);
cloudFilesProvider.GetObjectSaveToFile(inIntStoreID.ToString(), @"C:\EnetData\Development\Sanbox\OpenStack\OpenStackConsole\testImages\", inStrFileName);

работает отлично. но когда я пытаюсь

System.IO.Stream outputStream = new System.IO.MemoryStream();
cloudFilesProvider.GetObject(inIntStoreID.ToString(), inStrFileName, outputStream);
FileStream file = new FileStream(strSrcFilePath, FileMode.Create, System.IO.FileAccess.Write);
byte[] bytes = new byte[outputStream.Length];
outputStream.Read(bytes, 0, (int)outputStream.Length);
file.Write(bytes, 0, bytes.Length);
file.Close();
outputStream.Close();

я получаю файл с кучей нулей в нем.

2 ответа

Решение

Я думаю, что секрет вашей проблемы заключается в возвращаемом значении outputStream.Read - который, вероятно, возвращает 0.

Я бы попробовал следующий код вместо этого:

using (System.IO.Stream outputStream = new System.IO.MemoryStream())
{
    cloudFilesProvider.GetObject(inIntStoreID.ToString(), inStrFileName, outputStream);

    byte[] bytes = new byte[outputStream.Length];
    outputStream.Seek(0, SeekOrigin.Begin);

    int length = outputStream.Read(bytes, 0, bytes.Length);
    if (length < bytes.Length)
        Array.Resize(ref bytes, length);

    File.WriteAllBytes(strSrcFilePath, bytes);
}

Я могу подтвердить, что использование IO.SeekOrigin.Begin действительно работает. Таким образом, я могу определить класс, который имеет байтовый массив:

 public class RackspaceStream
 {
    private  byte[] _bytes;

    public byte[] Bytes 
    {
        get { return _bytes; }
        set { _bytes = value; }
    }
    // other properties as needed
}

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

    public RackspaceStream DownloadFileToByteStream(string containerName, string cloudObjectName)
    {
        RackspaceStream rsStream = new RackspaceStream();
        try
        {
            CloudFilesProvider cfp = GetCloudFilesProvider();

            using (System.IO.Stream outputStream = new System.IO.MemoryStream())
            {
                cfp.GetObject(containerName, cloudObjectName, outputStream);

                byte[] bytes = new byte[outputStream.Length];
                outputStream.Seek (0, System.IO.SeekOrigin.Begin);

                int length = outputStream.Read(bytes, 0, bytes.Length);
                if (length < bytes.Length)
                    Array.Resize(ref bytes, length);

                rsStream.Bytes = bytes; // assign the byte array to some other object which is declared as a byte array 

            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);

        }
        return rsStream;
    } // DownloadFileSaveToDisk

тогда возвращенный объект может быть использован в другом месте.....

Другие вопросы по тегам