Используя 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
тогда возвращенный объект может быть использован в другом месте.....