0

Rackspace .NET cloudifles API では、GetObjectSaveToFile メソッドがファイルを取得し、指定された場所に適切に保存しますが、GetObject メソッドを使用すると、返されたメモリストリームを保存すると、ファイルが null の束でいっぱいになります。

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

ヌルがたくさん入ったファイルを取得します。

4

2 に答える 2

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

その後、返されたオブジェクトを他の場所で使用できます.....

于 2016-05-21T07:39:29.583 に答える
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);
}
于 2013-08-05T20:35:19.110 に答える