设置IRandomAccessStream.Size错误? [英] set IRandomAccessStream.Size bug?

查看:56
本文介绍了设置IRandomAccessStream.Size错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码似乎表明,无法分配  IRandomAccessStream

的.Size属性来限制StorageFile流的大小:

The following code seems to show that the .Size property of a IRandomAccessStream
cannot be assigned to limit the size of a StorageFile stream:

        async void Test_StreamSize()

        {

            StorageFolder _folder = ApplicationData.Current.LocalFolder;

            StorageFile _file = null;

        async void Test_StreamSize()
        {
            StorageFolder _folder = ApplicationData.Current.LocalFolder;
            StorageFile _file = null;

            _file = null;

           试试
            {

                _file = await _folder.CreateFileAsync(" Test.Data",CreationCollisionOption.ReplaceExisting);



                IRandomAccessStream _stream = null;

            _file = null;
            try
            {
                _file = await _folder.CreateFileAsync("Test.Data", CreationCollisionOption.ReplaceExisting);

                IRandomAccessStream _stream = null;

                _stream = null;

               试试
                {

                    _stream = await _file.OpenAsync(FileAccessMode.ReadWrite);



                    Debug.WriteLine(" _stream.Size(0)=" + _stream.Size);
$


                    byte [] _buffer = new byte [100];

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; for(int i = 0; i< _buffer.Length; i ++)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _buffer [i] = 0xAB;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; IOutputStream _outputStream = null;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;试试
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _outputStream = _stream.GetOutputStreamAt(0);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; await _outputStream.WriteAsync(_buffer.AsBuffer());

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;等待_outputStream.FlushAsync();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;终于

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(_outputStream!= null)_outputStream.Dispose();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Debug.WriteLine(" _stream.Size(1)=" + _stream.Size);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //试图截断_stream $
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; ulong _newsize =(ulong)(_ buffer.Length / 2);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _stream.Size = _newsize;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //错误:新分配的.Size没有反映在这里

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Debug.WriteLine(" _stream.Size(3)=" + _stream.Size);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; byte [] _check_buffer = new byte [_buffer.Length];



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; IInputStream _inputStream = null;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;试试
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _inputStream = _stream.GetInputStreamAt(0);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; IBuffer _IBuffer = await _inputStream.ReadAsync(_check_buffer.AsBuffer(),(uint)_check_buffer.Length,InputStreamOptions.None);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; // STRANGE:_IBuffer.Length == _newsize

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Debug.WriteLine(" _IBuffer.Length =" +(_IBuffer!= null?_IBuffer.Length:0)+" _newsize =" + _newsize);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;终于

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(_inputStream!= null)_inputStream.Dispose();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;终于

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(_stream!= null)_stream.Dispose();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //重新打开流,检查其.Size

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _stream = null;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;试试
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _stream = await _file.OpenAsync(FileAccessMode.ReadWrite);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Debug.WriteLine(" _stream.Size(4)=" + _stream.Size);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;终于

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(_stream!= null)_stream.Dispose();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; catch(例外E)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Debug.WriteLine(E.Message);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;终于

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _file = null;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; }

                _stream = null;
                try
                {
                    _stream = await _file.OpenAsync(FileAccessMode.ReadWrite);

                    Debug.WriteLine("_stream.Size(0)=" + _stream.Size);

                    byte[] _buffer = new byte[100];
                    for (int i = 0; i < _buffer.Length; i++)
                    {
                        _buffer[i] = 0xAB;
                    }

                    IOutputStream _outputStream = null;
                    try
                    {
                        _outputStream = _stream.GetOutputStreamAt(0);
                        await _outputStream.WriteAsync(_buffer.AsBuffer());
                        await _outputStream.FlushAsync();
                    }
                    finally
                    {
                        if (_outputStream != null) _outputStream.Dispose();
                    }

                    Debug.WriteLine("_stream.Size(1)=" + _stream.Size);

                    // Attempting to truncate the _stream
                    ulong _newsize = (ulong)(_buffer.Length / 2);
                    _stream.Size = _newsize;

                    // ERROR: the newly assigned .Size doesn't reflect here
                    Debug.WriteLine("_stream.Size(3)=" + _stream.Size);

                    byte[] _check_buffer = new byte[_buffer.Length];

                    IInputStream _inputStream = null;
                    try
                    {
                        _inputStream = _stream.GetInputStreamAt(0);
                        IBuffer _IBuffer = await _inputStream.ReadAsync(_check_buffer.AsBuffer(), (uint)_check_buffer.Length, InputStreamOptions.None);
                        // STRANGE: _IBuffer.Length == _newsize
                        Debug.WriteLine("_IBuffer.Length=" + (_IBuffer != null ? _IBuffer.Length : 0) + " _newsize=" + _newsize);
                    }
                    finally
                    {
                        if (_inputStream != null) _inputStream.Dispose();
                    }

                }
                finally
                {
                    if (_stream != null) _stream.Dispose();
                }

                // reopening the stream, checking its .Size
                _stream = null;
                try
                {
                    _stream = await _file.OpenAsync(FileAccessMode.ReadWrite);
                    Debug.WriteLine("_stream.Size(4)=" + _stream.Size);
                }
                finally
                {
                    if (_stream != null) _stream.Dispose();
                }

            }
            catch (Exception E)
            {
                Debug.WriteLine(E.Message);
            }
            finally
            {
                _file = null;
            }

        }

输出:

_stream.Size(0)= 0

_stream.Size(1)= 100

_stream.Size(3)= 100

_IBuffer.Length = 50 _newsize = 50

_stream.Size(4)= 100

$

output:
_stream.Size(0)=0
_stream.Size(1)=100
_stream.Size(3)=100
_IBuffer.Length=50 _newsize=50
_stream.Size(4)=100

推荐答案

Hi Phillippe - 我正在研究这个和当我知道更多时,我会更新这个。
Hi Phillippe - I am researching this and wil update this when I know more.


这篇关于设置IRandomAccessStream.Size错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆