设置IRandomAccessStream.Size错误? [英] set IRandomAccessStream.Size bug?
问题描述
以下代码似乎表明,无法分配 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屋!