Muat File dari SDCard

Saya mengintegrasikan pembaca (ini)Pembaca EPUB ke proyek saya. Ini berfungsi dengan baik. & Saya ingin memuat file dari SDCard alih-alih penyimpanan perangkat yang terisolasi

Untuk membuka file dari penyimpanan Terisolasi kami memiliki IsolatedStorageFileStream seperti ini

IsolatedStorageFileStream isfs;
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
    try
    {
        isfs = isf.OpenFile([Path to file], FileMode.Open);
    }
    catch
    {
        return;
    }
}

ePubView.Source = isfs;

Untuk file di SDcard saya coba seperti ini

ExternalStorageDevice sdCard = (await ExternalStorage.GetExternalStorageDevicesAsync()).FirstOrDefault();

// If the SD card is present, get the route from the SD card.
if (sdCard != null)
{
    ExternalStorageFile file = await sdCard.GetFileAsync(_sdFilePath);
    // _sdFilePath is string that having file path of file in SDCard

    // Create a stream for the route.
    Stream file = await file.OpenForReadAsync();

    // Read the route data.
    ePubView.Source = file;
 }

Di sini saya mendapatkan pengecualian System.IO.EndOfStreamException

masukkan deskripsi gambar di sini

Jika Anda ingin mencoba.. Ini contoh proyek saya link

Pertanyaan : Bagaimana cara memberikan file saya sebagai sumber ke kontrol epubView

Apakah ini cara yang tepat, mohon beri saran mengenai hal ini.. Terima kasih


person Kumar    schedule 28.01.2014    source sumber
comment
Jadi, apakah itu berhasil? Apakah Anda mengalami masalah tertentu?   -  person richzilla    schedule 28.01.2014
comment
Kelihatannya oke. Ingatlah untuk menambahkan FileTypeAssociation di Manifest Anda.   -  person Romasz    schedule 28.01.2014
comment
Saya menambahkan FileTypeAssociation di Manifest & saya hampir lupa menyebutkan tentang pengecualian.. Saya mengedit pertanyaannya   -  person Kumar    schedule 28.01.2014
comment
Saya menambahkan contoh proyek di sini [sdrv.ms/1b0pXWv]   -  person Kumar    schedule 28.01.2014


Jawaban (2)


Meskipun saya belum mencoba pendekatan Anda, dan saya tidak bisa mengatakan dengan tepat di mana kesalahannya (mungkin file dari SD dibaca secara asinkron dan dengan demikian Anda mendapatkan EndOfStream, dan harap diingat bahwa seperti yang dikatakan di Situs Pembaca EPUB - ini sedang berat pengembangan). Periksa apakah setelah menyalin file ke ISOlatedStorage, Anda dapat menggunakannya.
Dalam hal ini saya akan mencoba menyalin terlebih dahulu dari SD ke aliran Memori seperti ini:

ExternalStorageDevice sdCard = (await ExternalStorage.GetExternalStorageDevicesAsync()).FirstOrDefault();

if (sdCard != null)
{
   MemoryStream newStream = new MemoryStream();
   using (ExternalStorageFile file = await sdCard.GetFileAsync(_sdFilePath))
    using (Stream SDfile = await file.OpenForReadAsync())
      newStream = await ReadToMemory(SDfile);

   ePubView.Source = newStream;
} 

Dan BacaKeMemori:

private async Task<MemoryStream> ReadToMemory(Stream streamToRead)
{
   MemoryStream targetStream = new MemoryStream();

   const int BUFFER_SIZE = 1024;
   byte[] buf = new byte[BUFFER_SIZE];
   int bytesread = 0;
   while ((bytesread = await streamToRead.ReadAsync(buf, 0, BUFFER_SIZE)) > 0)
   {
       targetStream.Write(buf, 0, bytesread);
   }
   return targetStream;
}

Mungkin itu akan membantu.

person Romasz    schedule 28.01.2014
comment
@Romsaz Ini berfungsi untuk pertama kalinya. Setelah itu tidak berfungsi.. memberikan nilai nol. Ini tautan dari MSDN. [social.msdn.microsoft.com/Forums/wpapps/en-US/ ] Terima kasih telah memberi saya harapan untuk memulai.. - person Kumar; 30.01.2014
comment
@kumar kode saya ditulis tanpa memeriksanya - Saya senang kode itu berhasil. Di mana Anda mendapatkan nol? Dan apa yang Anda maksud dengan tidak berfungsi selanjutnya - kapan? - person Romasz; 30.01.2014

Ada bug dengan aliran yang dikembalikan dari ExternalStorageFile. Ada dua opsi untuk menyiasatinya...

Jika filenya kecil maka Anda cukup menyalin aliran ke MemoryStream:

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

Namun, jika file terlalu besar Anda akan mengalami masalah memori sehingga kelas stream wrapper berikut dapat digunakan untuk memperbaiki bug Microsoft (meskipun dalam versi Windows Phone mendatang Anda harus menonaktifkan perbaikan ini setelah bug telah teratasi). tetap):

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

Kode tersedia di sini untuk mampir ke proyek Anda: https://github.com/gavinharriss/ExternalStorageFileWrapper-wp8

Contoh penggunaan:

ExternalStorageFile file = await device.GetFileAsync(filename); // device is an instance of ExternalStorageDevice
Stream streamOriginal = await file.OpenForReadAsync();
ExternalStorageFileWrapper streamToUse = new ExternalStorageFileWrapper(streamOriginal);
person Gavin    schedule 25.02.2014
comment
Maaf atas balasan yang sangat terlambat. & Ya, untuk beberapa file proyek saya tidak berfungsi. Saya menambahkan proyek Anda ke solusi saya & sungguh saya tidak mengerti cara menggunakan kode Anda di ExternalStorageFileWrapper class. Bisakah Anda menyarankan apa yang harus dilakukan setelah mendapatkan aliran file. ExternalStorageFileWrapper EFW = new ExternalStorageFileWrapper(s); - person Kumar; 05.03.2014
comment
Ada contoh kode di bagian bawah github.com/gavinharriss/ExternalStorageFileWrapper-wp8 - apakah itu tolong kamu? ExternalStorageFileWrapper mengimplementasikan antarmuka Stream sehingga dapat digunakan sebagai pengganti aliran asli. - person Gavin; 05.03.2014
comment
Ya.. Saya menggunakan Kode itu, Sepertinya ada masalah dengan kode saya setelah mendapatkan file dari SDcard. bukan masalah dengan ExternalStorageFileWrapper Anda. Izinkan saya memeriksa beberapa kemungkinan lagi. Saya akan menginformasikan status hasilnya di sini. Terima kasih - person Kumar; 06.03.2014