写入硬盘错误 - 打开的文件太多

时间:2014-03-06 16:41:58

标签: xamarin.ios

在某些过程中,我将对象存储到文件中(序列化)。每批将存储100个文件。我很快就收到“打开文件太多”的错误。

我正在使用后立即关闭StreamWriter,我也尝试处理该文件。我有一个多线程应用程序,但我将存储集中到一个线程中,以确保不会有多个并行的X操作。我现在甚至按对象存储对象(一次一个),我仍然会收到此错误。

看起来“关闭”或“处理”StreamWriter是不够的。有人在想吗?

我尝试了很多不同的代码,但这是我目前的代码:

            Log.i("Streamwriter opened");
            StreamWriter outfile = new StreamWriter (filePath);
            outfile.Write (content);
            outfile.Close ();
            outfile.Dispose ();
            Log.i("Streamwriter closed");

我也打印出来以确保“打开”文件后立即“关闭”文件。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在发布此问题之前,我已经尝试了仪器和I / O模板,但在那里找不到任何奇怪的东西。我现在尝试了以下链接中的一些其他方法:on iOS/iPhone: "Too many open files": need to list open files (like lsof)(链接发布在poupou在他的评论中发布的stackoverflow线程中)

对我来说最好的方法就是在终端中键入“lsof”。我立即看到我的数据库有很多打开的文件。 在序列化之前,我还将对象的ID写入我的数据库。因为错误“太多打开的文件”总是指向我的序列化代码(而不是我的数据库代码),我正在寻找一个问题。

将对象插入数据库时​​,我正在使用“SqliteConnection”。我正在关闭并处理此对象,但是,这似乎还不足以真正关闭我的数据库文件。

此网址对我有用:SQLite keeps the database locked even after the connection is closed

确实没有处置“SqliteCommand”本身。

修好后,我不再收到此错误。

谢谢!

    SqliteConnection cnn = new SqliteConnection(dbConnection);
    cnn.Open();
    SqliteCommand mycommand = new SqliteCommand(cnn);
    mycommand.CommandText = sql;
    object value = mycommand.ExecuteScalar();
    mycommand.Dispose ();     // <= THIS FIXED THE ERROR
    cnn.Close();
    cnn.Dispose ();

答案 1 :(得分:0)

如果使用的是FileSystemWatcher,则可能是问题的原因:SO post

当我们在项目中禁用FileSystemWatcher时,错误消失了(尽管Xamarin.Mac遇到了相同的错误,但可能与Xamarin.iOS也相关)。