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ストリームへの呼び出しの追加は機能します。これは、をラップしているためですFileStreamStreamWriterに書き込みますが、実際のファイルに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

ファイル使用の最後にすべてが正しく閉じられるように、usingブロックで囲みますStreamWriter。また、これを機能させるためにを作成する必要はないと思います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には、作成/開くファイルの名前と、ファイルを追加モードで開くか上書きするかを示すフラグの2つのパラメーターを受け入れるコンストラクターがある ことに注意してください。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.Disposeusingこれは、 -を使用すると暗黙的に呼び出され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 に答える