2012-05-01 22 views
9

Tôi nhận được ngoại lệ trên và lỗi trên đoạn mã sau, mà có nghĩa là để chơi một file mp3 được lựa chọn từ Isolated Storage:Bắt IsolatedStorageException: Hoạt động không được phép trên IsolatedStorageFileStream

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

Lỗi này là rất mơ hồ rằng tôi không thực sự chắc chắn những gì có thể sai ... Bất kỳ ý tưởng hoặc ít nhất là nguồn phổ biến của lỗi này mà tôi có khả năng có thể kiểm tra?

EDIT: ngoại trừ đã được ném vào: using(var isfs = isf.OpenFile(...))

EDIT 2: Các vết đống ...

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) 

Tôi đã nhận ra quá rằng lỗi không xảy ra nếu tôi chơi một bài hát sau đó dừng lại (có nút phát và tạm dừng trong giao diện người dùng), sau đó phát một bài hát khác. Nó xảy ra khi tôi chơi một bài hát, dừng lại, và cố gắng chơi lại bài hát đó.

+1

Hướng dẫn nào đang kích hoạt lỗi, isf.OpenFile? Nếu vậy, hãy đảm bảo rằng tệp tồn tại. Bạn có thể kiểm tra bằng cách gọi 'isf.FileExists (selected.Path)' trước khi mở tập tin –

+0

Vâng, đó là dòng đó. Tôi đã kiểm tra không chính thức bằng cách viết để điều khiển các kết quả của 'isf.FileExists (selected.Path)' vì tôi nghĩ có thể đó là trường hợp, nhưng nó thực hiện và đưa vào một câu lệnh if thực tế không giải quyết được vấn đề. –

+0

Tôi không thể nghĩ ra bất kỳ lý do nào tại sao mã này sẽ ném một ngoại lệ với một tệp hiện có. Bạn có thể cho chúng tôi biết giá trị của 'selected.Path' không? –

Trả lời

8

Sự cố xảy ra khi bạn phát cùng một bản nhạc hai lần, do đó, đó có thể là sự cố chia sẻ tệp. Bạn nên cố gắng để cung cấp các thông số FileShare của phương pháp OpenFile:

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

Mặc dù tôi không hiểu tại sao nó sẽ xảy ra, vì bạn đang đóng một cách rõ ràng các tập tin.

EDIT: OK, đã làm một số đào với Reflector, và tôi figured nó ra. Mã của MediaElement.SetSource là:

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

Vì vậy, về cơ bản, nó không sử dụng luồng bạn cung cấp và thậm chí nó đóng nó. Nhưng nó giữ tên của tập tin, và tôi đoán nó sẽ mở lại khi bạn chơi nhạc. Do đó, nếu bạn cố gắng mở lại cùng một tệp với quyền truy cập độc quyền trong khi đang phát nhạc, nó không thành công vì MediaElement đã mở tệp. Khôn lanh.

+0

Điều đó làm việc! Ty rất nhiều. :) Tôi không nghĩ rằng tôi cần nó hoặc kể từ khi tôi đóng một cách rõ ràng các tập tin ... Nhưng điều đó cố định vấn đề. –

+0

Vui vì nó hoạt động, nhưng tôi không biết gì. Tôi đoán rằng bằng cách nào đó 'media.SetSource' ngăn chặn các dòng được đóng lại ... Loại' phương tiện' là gì? Nếu bạn loại bỏ dòng 'this.media.SetSource (isfs)', mà không thêm tham số FileShare, bạn vẫn có lỗi? –

1

Tôi tin rằng bạn nên sử dụng một IsolatedStorageFileStream:

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

Ngoài ra, lưu ý rằng bạn không cần phải gọi .Close() hoặc .Dispose() phương pháp khi chúng được đưa về chăm sóc trong những điều khoản sử dụng.

+0

Tôi đã thử cách này trước và vẫn gặp lỗi tương tự. :( –

Các vấn đề liên quan