6

我正在尝试制作一个将数据存储在 TXT 日志文件中的简单软件。这是我的代码

FileStream fs = null;
StreamWriter fw = null;
try
{
    fs= new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
    fw = new StreamWriter(fs);
    fw.Write("sadadasdsadsadsadas");

    for (int i = 0; i < AnimalShelter.AnimalList.Count; i++)
    {
        fw.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>");
        Console.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>");
    }
}
catch(IOException)
{
    MessageBox.Show("ERROR THROWN");
}
finally
{
    if (fs!= null) fs.Close();
    //  if (fw != null) fw.Close();
}

我实现的是:文件被创建,但没有写入任何内容。我检查了很多帖子,但找不到任何特别的帮助。

4

5 回答 5

7

添加对流的调用Flush有效。这是因为您正在包装FileStream. StreamWriter将写入FileStream,但您需要指明何时将 发送Stream到实际文件。此外,您可以用以下方式交换您try finallyusing

try
{
    using (var fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
    {
        using (var fw = new StreamWriter(fs))
        {
            fw.Write("sadadasdsadsadsadas");

            for (int i = 0; i < AnimalShelter.AnimalList.Count; i++)
            {
                fw.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>");
                Console.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>");

            }
            fw.Flush(); // Added
        }
    }
}
catch(IOException)
{
    MessageBox.Show("ERROR THROWN");
}
于 2013-03-16T18:29:33.460 回答
5

将您StreamWriter包含在 using 块中,以确保在文件使用结束时正确关闭所有内容,而且我认为您不需要为此创建一个FileStream

try
{
    string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "textme.txt")
    using(fw = new StreamWriter(fileName, true))
    {
         ......
    }
}
catch(IOException)
{
    MessageBox.Show("ERROR THROWN");
}

请注意,StreamWriter有一个构造函数,它接受两个参数,要创建/打开的文件的名称和一个指示文件应该以追加模式打开或覆盖的标志, 请参阅 StreamWriter 文档

于 2013-03-16T18:31:56.817 回答
2

始终使用using(如前所述),您不会遇到问题(或必须考虑)...

using (FileStream fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
using (StreamWriter fw = new StreamWriter(fs))
{
    fw2.Write("sadadasdsadsadsadas");
}  

(你也可以关闭作者而不是应该工作的文件流)

据我所知,问题是......

FileStream.Close实际上是Stream.Close- 并且调用Dispose但它不是虚拟的,所以一些一般清理。

FileStream.Dispose当您使用using- 执行特定Flush然后Close/Dispose 时,它​​会被隐式调用 - 正确的特定清理也是如此。

您可以通过using通常推荐的模式来避免任何这种情况(坦率地说,我从来没有让我参与其中)

于 2013-03-16T19:05:44.290 回答
1

的确, Flush() 是答案;但是,我会File.WriteAllLines()改用。

try
{
    var fileName = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"/textme.txt";
    var lines = AnimalShelter.AnimalList.Select(o=> "<chipNr>" + o.ChipRegistrationNumber + "</chipNr>");
    File.WriteAllLines(fileName, lines);
    foreach(var line in lines)
        Console.WriteLine(line);
}
catch(IOException)
{
    MessageBox.Show("ERROR THROWN");
}
于 2013-03-16T18:36:00.653 回答
0

尝试使用它 - 只需替换数组:

try
{
    using (Stream fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
    {
        using (StreamWriter sw = new StreamWriter(fs))
        {
            int[] test = new int[] { 0, 12, 23, 46 };
            sw.Write("sadadasdsadsadsadas");
            for (int i = 0; i < test.Length; i++)
            {
                sw.WriteLine("<chipNr>" + test[i] + "<chipNr>");
                Console.WriteLine("<chipNr>" + test[i] + "<chipNr>");
            }
            sw.Close();                    
        }
        fs.Close();
    } 

}
catch (IOException)
{
    MessageBox.Show("ERROR THROWN");
}
于 2013-03-16T18:36:41.837 回答