4

我在读取 Windows Phone SD 卡上的文件时遇到问题。我使用 ExternalStorageFile.OpenForReadAsync 获得了有效的 Stream 对象。但是,尽管流 CanSeek 属性为真,但任何查找操作都将被忽略并且位置不会移动;

    private async void ReadFileOnSDCard(ExternalStorageFile file)
    {
        Stream stream = await file.OpenForReadAsync();
          using (stream)
          {
                 long curPos= stream.Seek(100, SeekOrigin.Begin);
                 long pos = stream.Position;

// curPos 和 pos 都是 0。

4

3 回答 3

2

我正在与同样的问题作斗争。在 Microsoft.Phone.Storage.NativeFileStream 中,Seek 确实被破坏了,这是 SD 卡上文件的流类型。最后,我用 ILspy 看了课程,就是这样:

public override long Seek(long offset, System.IO.SeekOrigin origin)
{
   ...
   uint num = (uint)((ulong)(offset & -4294967296L) >> 32);
   uint num2 = (uint)(offset & (long)((ulong)-1));
   uint num3 = NativeFileStream.SetFilePointer(this.m_handle, num, ref num2, 
   ...
}

和功能 SetFilePointer:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa365541%28v=vs.85%29.aspx

为了使搜索工作,偏移值应该在长的高 32 位。

于 2013-06-27T23:46:44.327 回答
0

我猜你正在阅读一个带有Windows Phone 保留的扩展名的文件。不幸的是,您无法从 Windows Phone 上的 SD 卡中读取它们。如果您正在阅读的文件属于这些保留的扩展名,Windows Phone 只是简单地忽略它们。

假设您没有阅读那些保留的扩展,您可以按照这两个步骤来解决您的问题。

1/ 首先检查你是否已经添加 <Capability Name="ID_CAP_REMOVABLE_STORAGE" />到你的 WMAppManifest.xml

2/ 如果您没有注册文件关联扩展名,例如 .gpx

<FileTypeAssociation TaskID="_default" Name="GPX" NavUriFragment="fileToken=%s">
  <Logos>
    <Logo Size="small" IsRelative="true">Assets/Route_Mapper_Logo33x33.png</Logo>
    <Logo Size="medium" IsRelative="true">Assets/Route_Mapper_Logo69x69.png</Logo>
    <Logo Size="large" IsRelative="true">Assets/Route_Mapper_Logo176x176.png</Logo>
  </Logos>
  <SupportedFileTypes>
    <FileType ContentType="application/gpx">.gpx</FileType>
  </SupportedFileTypes>
</FileTypeAssociation>
于 2013-05-11T23:23:36.813 回答
0

如果文件很小,那么您可以简单地将流复制到 MemoryStream。我已经对此进行了测试,并且可以正常工作:

Stream s = await file.OpenForReadAsync();
MemoryStream ms = new MemoryStream();
s.CopyTo(ms);

但是,如果文件太大,您将遇到内存问题,因此可以使用以下流包装类来纠正 Microsoft 的错误(尽管在未来版本的 Windows Phone 中,一旦错误出现,您需要禁用此修复固定的):

using System;
using System.IO;

namespace WindowsPhoneBugFix
{
    /// <summary>
    /// Stream wrapper to circumnavigate buggy Stream reading of stream returned by ExternalStorageFile.OpenForReadAsync()
    /// </summary>
    public sealed class ExternalStorageFileWrapper : Stream
    {
        private Stream _stream; // Underlying stream

        public ExternalStorageFileWrapper(Stream stream)
        {
            if (stream == null)
                throw new ArgumentNullException("stream");

            _stream = stream;
        }

        // Workaround described here - http://stackoverflow.com/a/21538189/250254
        public override long Seek(long offset, SeekOrigin origin)
        {
            ulong uoffset = (ulong)offset;
            ulong fix = ((uoffset & 0xffffffffL) << 32) | ((uoffset & 0xffffffff00000000L) >> 32);
            return _stream.Seek((long)fix, origin);
        }

        public override bool CanRead
        {
            get { return _stream.CanRead; }
        }

        public override bool CanSeek
        {
            get { return _stream.CanSeek; }
        }

        public override bool CanWrite
        {
            get { return _stream.CanWrite; }
        }

        public override void Flush()
        {
            _stream.Flush();
        }

        public override long Length
        {
            get { return _stream.Length; }
        }

        public override long Position
        {
            get
            {
                return _stream.Position;
            }
            set
            {
                _stream.Position = value;
            }
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return _stream.Read(buffer, offset, count);
        }

        public override void SetLength(long value)
        {
            _stream.SetLength(value);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            _stream.Write(buffer, offset, count);
        }
    }
}

代码可在此处放入您的项目: https ://github.com/gavinharriss/ExternalStorageFileWrapper-wp8

于 2013-12-30T07:25:03.697 回答