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尝试执行某些操作时都会发生错误。
答案 0 :(得分:1)
您没有处置FileStream
或StreamWriter
。所以他们可能会抓住某些东西......尤其是如果抛出异常的话。
用using
块包裹它们。
从技术上讲,StreamWriter可以取得所有权并处置FileStream
,但我更喜欢明确。
此外,您可能希望确保一次只执行一次此操作。围绕整个事情的简单lock(_myMutex) {}
就足够了。 _myMutex
为private 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();
}
}
}