2012-05-01 10 views
9

sto ottenendo l'eccezione di cui sopra e di errore sul seguente codice, che è destinata a riprodurre un file mp3 selezionato da isolato bagagli:Ottenere IsolatedStorageException: Operation not permitted on IsolatedStorageFileStream

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

L'errore è così vago che non sono veramente sicuro di cosa potrebbe essere sbagliato ... Qualche idea o almeno le fonti più comuni di questo errore che potrei potenzialmente verificare?

EDIT: l'eccezione viene gettata a: using(var isfs = isf.OpenFile(...))

EDIT 2: L'analisi dello stack ...

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) 

ho capito anche che l'errore non si verifica se gioco una canzone quindi fermalo (c'è un pulsante play e pause nell'interfaccia utente), quindi riproduci un altro brano. Succede quando suono una canzone, la interrompo e tento di suonare di nuovo la stessa canzone.

+1

Quale istruzione sta attivando l'errore, isf.OpenFile? Se è così, assicurati che il file esista. È possibile controllare chiamando 'isf.FileExists (selected.Path)' prima di aprire il file –

+0

Sì, è quella linea. Ho fatto un controllo informale scrivendo per consolare i risultati di 'isf.FileExists (selected.Path)' poiché pensavo che fosse il caso, ma lo fa e inserire un'effettiva istruzione if non risolve il problema. –

+0

Non riesco a pensare a nessuna ragione per cui questo codice genererebbe un'eccezione con un file esistente. Puoi mostrarci il valore di 'selected.Path'? –

risposta

8

Il problema si verifica quando si riproduce la stessa musica due volte, pertanto potrebbe trattarsi di un problema di condivisione file. Si dovrebbe cercare di fornire il parametro FileShare del metodo OpenFile:

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

Anche se io non capisco perché che sarebbe successo, dal momento che si sta chiudendo in modo esplicito il file.

MODIFICA: OK, ho scavato con Reflector e l'ho capito. Il codice di MediaElement.SetSource è:

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

Quindi, fondamentalmente non utilizza il flusso si dà, ed è anche lo chiude. Ma mantiene il nome del file, e suppongo che lo riapri quando suoni la musica. Pertanto, se si tenta di riaprire lo stesso file con accesso esclusivo mentre la musica è in riproduzione, non riesce perché MediaElement ha il file aperto. Difficile.

+0

Questo ha funzionato! Ty così tanto :) Non pensavo di averne bisogno neanche da quando ho chiuso esplicitamente il file ... Ma questo ha risolto il problema. –

+0

Sono contento che abbia funzionato, ma non ho capito. Suppongo che in qualche modo 'media.SetSource' impedisca che il flusso venga chiuso ... Qual è il tipo di' media'? Se rimuovi la riga 'this.media.SetSource (isfs)', senza aggiungere il parametro FileShare, hai ancora l'errore? –

1

Credo che si dovrebbe utilizzare un IsolatedStorageFileStream:

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

Si noti inoltre che non è necessario chiamare le .Close() o .Dispose() metodi come sono curati nei prospetti che utilizzano.

+0

L'ho provato prima e ho ancora ottenuto lo stesso errore. :( –

Problemi correlati