“每当我尝试使用此方法时,mscorlib.dll中出现'System.IO.IOException'类型的未处理异常

时间:2017-05-17 17:47:26

标签: c#

public void SaveAll(int volume, int duration, string playing, int 
                        LBPindex, int LBSindex, string URL, int maximum)
{
    FileStream fs = new FileStream("SaveDATA.bin", FileMode.Create);
    StreamWriter sw = new StreamWriter(fs, Encoding.Default);
    sw.WriteLine("SETTINGS" + "|" + volume + "|" + duration + "|" + 
    playing + "|" + LBPindex + "|" + LBSindex + "|" + URL + "|" + 
    maximum);

    foreach (var item1 in Playlist.SavedPlaylists)
    {
        sw.Write("PLAYLIST" + "|" + item1.Name + "|");
        foreach (var item2 in item1.SavedSongs)
        {
            sw.WriteLine(item2.Path + "|" + item2.Title + "|" + 
            item2.Author + "|" + item2.Album + "|" + item2.Release + 
            "|" + item2.Genre + "|" + item2.Comment);
        }
    }
    sw.Close();
    fs.Close();
}

我正在制作音乐播放器,每当用户将某些内容更改为播放列表,歌曲或任何内容时,都会使用此方法。

每次我的Filestream尝试执行某些操作时都会发生错误。

1 个答案:

答案 0 :(得分:1)

您没有处置FileStreamStreamWriter。所以他们可能会抓住某些东西......尤其是如果抛出异常的话。

using块包裹它们。

从技术上讲,StreamWriter可以取得所有权并处置FileStream,但我更喜欢明确。

此外,您可能希望确保一次只执行一次此操作。围绕整个事情的简单lock(_myMutex) {}就足够了。 _myMutexprivate static readonly _myMutex = new object();

的位置

另一个注意事项:您要确保您的文件是可写的。应用程序通常安装到Program Files,不允许写入文件(没有UAC /系统)。

最后,如果你打开了这个文件的其他程序(例如记事本),它将锁定它。在这方面,一些编辑比其他编辑更好。因此,请确保关闭所有打开文件的程序。

编辑:已添加完整示例。

EDIT2:更改了文件路径,请务必关闭编辑器。

private static readonly _fileMutex = new object();

public void SaveAll(int volume, int duration, string playing, int 
                        LBPindex, int LBSindex, string URL, int maximum)
{
    lock (_fileMutex) 
    {
        var filePath = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData), "SaveDATA.bin");
        using (FileStream fs = new FileStream(filePath, FileMode.Create))
        {
            using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
            {
                sw.WriteLine("SETTINGS" + "|" + volume + "|" + duration + "|" + playing + "|" + LBPindex + "|" + LBSindex + "|" + URL + "|" + maximum);

                foreach (var item1 in Playlist.SavedPlaylists)
                {
                    sw.Write("PLAYLIST" + "|" + item1.Name + "|");
                    foreach (var item2 in item1.SavedSongs)
                    {
                        sw.WriteLine(item2.Path + "|" + item2.Title + "|" + item2.Author + "|" + item2.Album + "|" + item2.Release + "|" + item2.Genre + "|" + item2.Comment);
                    }
                }
                sw.Close();
            }
            fs.Close();
        }
    }
}