2012-05-01 8 views
9

Me estoy poniendo la excepción arriba y error en el código siguiente, que está destinado a reproducir un archivo MP3 seleccionado de almacenamiento aislado:IsolatedStorageException Conseguir: no se permite el funcionamiento en IsolatedStorageFileStream

using (var isf = IsolatedStorageFile.GetUserStoreForApplication()) 
{    
    using (var isfs = isf.OpenFile(selected.Path, FileMode.Open)) 
    {       
      this.media.SetSource(isfs);    
      isfs.Close();       
    }      
    isf.Dispose(); 
} 

El error es tan vaga que no estoy seguro de qué podría estar mal ... ¿Alguna idea o al menos una fuente común de este error que podría verificar?

EDIT: la excepción se está lanzando en: using(var isfs = isf.OpenFile(...))

EDIT 2: El seguimiento de pila ...

at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, IsolatedStorageFile isf) 
at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, IsolatedStorageFile isf) 
at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, IsolatedStorageFile isf) 
at Ringify.Phone.PivotContent.RingtoneCollectionPage.MediaIconSelected(Object sender, GestureEventArgs e) 
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) 
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName) 

me he dado cuenta también que el error no se produce si juego una canción luego deténgalo (hay un botón reproducir y pausar en la IU), luego toque otra canción. Ocurre cuando toco una canción, la detengo e intento reproducir la misma canción nuevamente.

+1

¿Qué instrucción está desencadenando el error, isf.OpenFile? Si es así, asegúrese de que el archivo exista. Puede verificar llamando 'isf.FileExists (selected.Path)' antes de abrir el archivo –

+0

Sí, es esa línea. Hice un cheque informal escribiendo para consolar los resultados de 'isf.FileExists (selected.Path)' ya que pensé que tal vez ese era el caso, pero lo hace y poner en una declaración de if actual no resuelve el problema. –

+0

No puedo pensar en ninguna razón por la cual este código arrojaría una excepción con un archivo existente. ¿Puede mostrarnos el valor de 'selected.Path'? –

Respuesta

8

El problema ocurre cuando reproduce la misma música dos veces, por lo tanto, puede ser un problema de uso compartido de archivos. Usted debe tratar de proporcionar el parámetro del método FileShare OpenFile:

var isfs = isf.OpenFile(selected.Path, FileMode.Open, FileShare.Read) 

Aunque no entiendo por qué iba a pasar, ya que está cerrando explícitamente el archivo.

EDIT: Bien, hice algunas excavaciones con Reflector, y lo descubrí. El código de MediaElement.SetSource es:

public void SetSource(Stream stream) 
{ 
    if (stream == null) 
    { 
     throw new ArgumentNullException("stream"); 
    } 
    if (stream.GetType() != typeof(IsolatedStorageFileStream)) 
    { 
     throw new NotSupportedException("Stream must be of type IsolatedStorageFileStream"); 
    } 
    IsolatedStorageFileStream stream2 = stream as IsolatedStorageFileStream; 
    stream2.Flush(); 
    stream2.Close(); 
    this.Source = new Uri(stream2.Name, UriKind.Absolute); 
} 

Así que básicamente no utiliza la corriente que das, y que incluso lo cierra. Pero mantiene el nombre del archivo, y supongo que vuelve a abrirlo cuando tocas la música. Por lo tanto, si intenta volver a abrir el mismo archivo con acceso exclusivo mientras se reproduce la música, falla porque MediaElement tiene el archivo abierto. Difícil.

+0

¡Eso funcionó! Ty. :) No pensé que lo necesitaba tampoco porque cerré el archivo explícitamente ... Pero eso solucionó el problema. –

+0

Me alegro de que funcionó, pero no tengo ni idea. Supongo que de alguna manera 'media.SetSource' impide que la transmisión se cierre ... ¿Cuál es el tipo de' media'? Si elimina la línea 'this.media.SetSource (isfs)', sin agregar el parámetro FileShare, ¿todavía tiene el error? –

1

creo que usted debe utilizar un IsolatedStorageFileStream:

using (var isf = IsolatedStorageFile.GetUserStoreForApplication()) 
{    
    using (var isfs = new IsolatedStorageFileStream(selected.Path, FileMode.Open, isf)) 
    {       
      this.media.SetSource(isfs);    
    }      
} 

Además, tenga en cuenta que no es necesario llamar a los .Close() o .Dispose() métodos, ya que son atendidos en las instrucciones using.

+0

Intenté esto antes y todavía tengo el mismo error. :( –

Cuestiones relacionadas