2013-08-05 3 views
0

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

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

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

ответ

0

Я думаю, что секрет вашей проблемы заключается в возвращаемом значении 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); 
} 
+0

да что снова работал спасибо :) – gopstar

0

Я могу подтвердить, что с помощью 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 

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

 Смежные вопросы

  • Нет связанных вопросов^_^